使用fork()时收获子进程

时间:2014-11-18 04:35:25

标签: c multithreading fork

当我使用fork()并行运行两个命令时,我正试图收获子进程。我正在使用以下代码执行此操作:

int process() {
    int w, status;  
    while ((w = waitpid(-1,&status,WNOHANG)) > 0)                               
         fprintf(stderr,"Completed: %d (%d)\n",w,status);

    int pid;                                                                
    if ((pid = fork()) < 0)                                                 
       errorExit (EXIT_FAILURE);                                           

    if (pid == 0) {                                                         
        // run first command                                            
    } else if (cmdList->right) {                                            
        // run second command                                           
    } 
}

我对这段代码的理解是:我不断地运行waitpid()程序的运行时,只要waitpid()返回大于0的值,它就会报告它(从而允许僵尸来然后执行fprintf()stderr。这种理解是错的吗?

1 个答案:

答案 0 :(得分:1)

此代码将确保删除所有已终止的子项,如标志所示:

  

WNOHANG

     

如果状态不能立即用于pid指定的子进程之一,则waitpid()函数不应暂停执行调用线程。

Ref

因此,当您遇到这些孩子时,您将执行fprintf()。因此,如果您有两个这样的孩子,fprintf()将被执行两次。 fprintf()将写入stderr

请注意,在执行该循环之后,再次调用fork(),这将创建一个子节点,这不会被循环处理。