Linux wait 函数实参为指针时,没有预期结果,原因及其解决办法
2011-02-21 15:52
465 查看
在Linux/Unix
中
wait
一般用在,用户主程序调用
fork
产生一个新的进程后,等待子进程执行完毕。在标准的
Unix
中
wait
的头文件定义为:
#include <sys/wait.h>
pid_t wait(int *statloc);
在Linux
中,定义为:
/*come from /usr/include/sys/wait.h
Wait for a child to die. When one does, put its status in *STAT_LOC ....
*/
extert __pid_t wait (__WAIT_STATUS __stat_loc);
也就是wait
的参数类型为
int
的指针类型。
以下为一段程序。
在Ubuntu10.4
下的结果如下:
main pid is 1754,my ppid is 1265
child pid is 1755,my ppid is 1754
I will wait
no proecss waited
Wait返回的PID值为-1,也就是父进程,没有等待到子进程的结束。
把@1出的变量s1修改为:int s1。并在@2和@3中作相应的改动。
程序如下:
同样在
在Ubuntu10.4
下的结果如下:
main pid is 1774,my ppid is 1265
child pid is 1775,my ppid is 1774
I will wait
my pid is 1774,waited pid is 1775,s1= 0
这里父进程ID为1774,子进程ID为1775,并准确等待到了子进程的结束。
原因:
如果一个函数的参数为指针,比如int f(int *p),则p的实参可以定义为,int * p 或者是 int p;
如果是前者在调用时用f(p),如果是后者在调用时,利用f(&p);都可以。
在这里为什么不一样,大家说一说?
中
wait
一般用在,用户主程序调用
fork
产生一个新的进程后,等待子进程执行完毕。在标准的
Unix
中
wait
的头文件定义为:
#include <sys/wait.h>
pid_t wait(int *statloc);
在Linux
中,定义为:
/*come from /usr/include/sys/wait.h
Wait for a child to die. When one does, put its status in *STAT_LOC ....
*/
extert __pid_t wait (__WAIT_STATUS __stat_loc);
也就是wait
的参数类型为
int
的指针类型。
以下为一段程序。
#include<stdio.h> #include<unistd.h> #include<sys/wait.h> int main(int argc, char *argv[]) { pid_t pid1 =0; pid_t child = 0; int * s1;//@1 printf("main pid is %d,my ppid is %d/n",getpid(),getppid()); child = fork(); if(child <0) { printf("fork error/n"); exit(0); } if(child ==0) { printf("child pid is %d,my ppid is %d/n",getpid(),getppid()); sleep(1); exit(0); } pid1 = wait(s1);//@2 printf("I will wait/n"); if(child == pid1) { printf("my pid is %d,waited pid is %d,s1= %d/n",getpid(),pid1,*s1);//@3 } else { printf("no proecss waited/n"); } return 0; }
在Ubuntu10.4
下的结果如下:
main pid is 1754,my ppid is 1265
child pid is 1755,my ppid is 1754
I will wait
no proecss waited
Wait返回的PID值为-1,也就是父进程,没有等待到子进程的结束。
把@1出的变量s1修改为:int s1。并在@2和@3中作相应的改动。
程序如下:
#include<stdio.h> #include<unistd.h> #include<sys/wait.h> int main(int argc, char *argv[]) { pid_t pid1 =0; pid_t child = 0; int s1;//@1 printf("main pid is %d,my ppid is %d/n",getpid(),getppid()); child = fork(); if(child <0) { printf("fork error/n"); exit(0); } if(child ==0) { printf("child pid is %d,my ppid is %d/n",getpid(),getppid()); sleep(1); exit(0); } pid1 = wait(&s1);//@2 printf("I will wait/n"); if(child == pid1) { printf("my pid is %d,waited pid is %d,s1= %d/n",getpid(),pid1,s1);//@3 } else { printf("no proecss waited/n"); } return 0; }
同样在
在Ubuntu10.4
下的结果如下:
main pid is 1774,my ppid is 1265
child pid is 1775,my ppid is 1774
I will wait
my pid is 1774,waited pid is 1775,s1= 0
这里父进程ID为1774,子进程ID为1775,并准确等待到了子进程的结束。
原因:
如果一个函数的参数为指针,比如int f(int *p),则p的实参可以定义为,int * p 或者是 int p;
如果是前者在调用时用f(p),如果是后者在调用时,利用f(&p);都可以。
在这里为什么不一样,大家说一说?
相关文章推荐
- fedora 14下uvc摄像头灰屏没有图像的问题原因及其解决办法
- Createprocess 函数运行出错的原因和解决办法
- ie6下提示没有权限的一种原因和相应的解决办法
- getjson中不能在函数体内给全局变量赋值的原因及解决办法
- 工行U盾出现“没有检测到卡片/PKCS11初始化失败”错误的原因和解决办法
- jquery点击事件失效原因及其解决办法
- 子div块中设置margin-top时影响父div块位置的解决办法及其原因
- dsoframer 注册控件后在某些机器调用部分函数时提示"没有注册接口"的解决办法
- svn之check out没有下载so文件原因和解决办法
- Firefox对函数getYear()返回不正确的原因和解决办法
- MyEclipse的Expressions没有结果的解决办法
- java.io.CharConversionException: isHexDigit 出现错误的原因及其解决办法
- ANR异常产生的原因及其解决办法
- 举例说明出现case expressions must be constant expressions错误的原因及其解决办法
- apache配置 php中没有php5apache2_2.dll的原因及解决办法
- ls command not found vi command not found 只要的原因是因为环境变量的问题,编辑profile文件没有写正确,导致在命令行下 ls等命令不能够识别。 解决办法:
- JSONObject jsonObject=JSONObject.fromObject(map) 执行到这的时候没有任何反应的原因及解决办法
- 出现异常org.hibernate.DuplicateMappingException: duplicate import ..."的原因及其解决办法。
- apache配置,php中没有php5apache2_2.dll的原因及解决办法
- "performSelector may cause a leak because its selector is unknown"警告原因及其解决办法