我正在学习Ubuntu中的进程及其行为,但是对wait()有点困惑.所以我的问题是:
>如何在while(wait(NULL)> 0)中声明;正在工作?
>在wait()中使用NULL的目的是什么?
我已经在终端中看到了输出,但是即使执行了wait()函数,父级仍在执行并使子级化.父执行不应停止吗?这是代码:
int main(int argc, char *argv[])
{
pid_t childid;
if(argc!=2)
{
printf("Please provide an argument in terminal! \n");
return 0;
}
int i,n=atoi(argv[1]);
for(i=0;i<n;i++)
{
childid=fork();
if(childid==0)
{
printf("Inside Child process! \n My id is %d\n",getpid());
break; // creating fan process structure
}
else
if(childid>0)
{
printf("Inside Parent Process! \n My id is %d\n",getpid());
}
}
while(wait(NULL)>0);
printf("After While Statment!\n My id is %d\n My parent ID is %d\n Child id is %d\n",getpid(),getppid(),childid);
}
我知道这是一个非常la脚的问题,但这是人们学习的方式:)
谢谢
解决方法:
while(wait(NULL)> 0)的语句如何;正在工作?
该函数等待,等待任何子进程的终止,如果成功,则返回终止子进程的进程标识符;如果没有子进程,则返回-1.
在您的代码中,父进程基本上等待它创建的所有子进程的终止.
对于任何孩子,此调用将立即返回-1,因为他们尚未创建任何进程.
wait()中NULL的目的是什么?
如果您看到等待的原型,就是这样,
pid_t wait(int *status);
父进程可以在变量状态中获取子进程的退出状态(我们需要在wait函数中传递整数的地址,以更新该整数),然后通过WEXITSTATUS宏提取该值.
传递NULL(因为变量是指针类型,所以传递NULL)意味着,程序员对该值不感兴趣,并且他将其通知等待调用.
我对您的代码进行了一些修改,以解释wait函数的返回值以及非NULL参数的使用.现在,所有子代都返回一个值(循环索引i),该值由父代获取.
Pl.看看是否有帮助,
#include<stdio.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<stdlib.h>
int main(int argc, char *argv[])
{
pid_t childid;
int ret;
int status;
if(argc!=2)
{
printf("Please provide an argument in terminal! \n");
return 0;
}
int i,n=atoi(argv[1]);
for(i=0;i<n;i++)
{
childid=fork();
if(childid==0){
printf("Inside Child process! \n My id is %d\n",getpid());
break; // creating fan process structure
}
else if(childid > 0){
printf("Inside Parent Process! \n My id is %d\n",getpid());
}
}
//The line below, will be immediatly false for all the children
while ((ret= wait(&status))>0)
{
printf("After While My id is %d and my child with pid =%d exiting with return value=%d\n" ,
getpid(),ret, WEXITSTATUS(status));
}
//The if below will be true for the children only
if ((0 > ret) && (childid == 0)){
printf("Child with id %d exiting and my parent's id is %d\n", getpid(), getppid());
exit(i);
}
else{
printf("Parent Finally Exiting\n");
}
}