Ubuntu中的wait()函数

时间:2012-09-23 10:27:14

标签: c linux ubuntu-10.04 wait waitpid

我正在学习Ubuntu中的进程及其行为,但我在wait()中有点困惑。所以我的问题是:

  1. 法规 while(wait(NULL)> 0); 如何工作?
  2. wait()中 NULL 的目的是什么?
  3. 我已经在终端中看到了输出但父进程正在执行并生成子进程,即使它执行了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);
    

    }

    我知道这是一个非常蹩脚的问题,但这是人们学习的方式:)

    由于

1 个答案:

答案 0 :(得分:4)

法规 while(wait(NULL)&gt; 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");
 }
}