如何在C语言中使用wait函数

17

如何使用wait?它总是让我困惑不已。我用递归fork了一棵进程树,现在子进程必须暂停(等待/睡眠),等我运行pstree以便打印进程树。

我应该使用什么?

int status;
wait(&status);

或者说

wait(NULL)

我应该把这段代码放在哪里?放在父级的if(pid > 0) 还是子级的 if(pid==0)?也许应该放在所有ifs的结尾,然后将所有的pid存储到数组中,再使用for循环处理并使用wait函数?

我的代码模板:

void ProcRec(int index)
{
     pid_t pid;
     int noChild = getNChild(index);

     int i= 0;
     for(i = 0; i < noChild; i++)
     { 
          pid = fork();

        if (pid > 0)
        {
            /* parent process */
        }
        else if (pid == 0)
        {
            /* child process. */
            createProc(index+1);
        }
        else
        {
            /* error */
            exit(EXIT_FAILURE);
        }
    }

    if(getpid() == root)
    {
        sleep(1); 
        pid = fork();
        if(pid == 0)
          execl("/usr/bin/pstree", "pstree", getppid(), 0);    
    }
}

1
睡眠(/你想等待多少秒/);。 睡眠(1); 等待1秒。 - user3451749
1
这些链接将帮助您更好地了解fork()和wait()的工作原理。请查看它们,然后回到您的问题。如果没有帮助,请寻求帮助:http://www.csl.mtu.edu/cs4411.ck/www/NOTES/process/fork/wait.html,https://dev59.com/pm025IYBdhLWcg3wHR8Y,http://www.csl.mtu.edu/cs4411.ck/www/NOTES/process/fork/create.html - neerajDorle
2
阅读waitsleep手册页面。我相信你很快就能找到它们之间的区别。 - Some programmer dude
我理解fork的工作原理。我也能区分sleepwait的不同。我不知道的是int status是什么,何时使用status或者何时使用NULL,以及在哪里使用wait才能使用pstree - jabk
1个回答

20

wait系统调用会使进程休眠并等待子进程结束。然后,它将使用子进程的退出码填充参数(如果参数不是NULL)。

因此,如果在父进程中有以下代码:

int status;
if (wait(&status) >= 0)
{
    if (WIFEXITED(status))
    {
        /* Child process exited normally, through `return` or `exit` */
        printf("Child process exited with %d status\n", WEXITSTATUS(status));
    }
}

在子进程中,您可以执行例如 exit(1) ,然后上面的代码将打印:

子进程以1状态退出

此外,请注意在父进程结束前等待所有子进程是很重要的。你没有等待的子进程将处于所谓的僵尸状态,而父进程仍在运行,一旦父进程退出,这些子进程将变成孤儿并成为进程1的子进程。

2
@user2202368 那么你不需要关心状态,只需等待子进程退出即可。 - Some programmer dude
你如何等待多个子进程? - Cătălina Sîrbu
@CătălinaSîrbu wait 等待 第一个 子进程。 - Some programmer dude

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接