使用带有waitpid的Forks

时间:2013-12-15 12:19:32

标签: c fork waitpid

是否有3个子进程和1个父进程? 这两个不同的waitpid做了什么,为什么还有两个呢?

int main()
{
    pid_t pid;

    int status, counter = 4;
    while(counter > 0)
    {
        pid = fork();
        if(pid)
        {
            counter /= 2;
        }
        else
        {
            printf("%d", counter); /* (1) */
            break;
        }
    }
    if(pid)
    {
        waitpid(-1, &status, 0);
        counter += WEXITSTATUS(status);
        waitpid(-1, &status, 0);
        counter += WEXITSTATUS(status);
        printf(";%d", counter); /* (2) */
    }
    return counter;
}

waitpid打印3,5,6,34,52,61(不包括分号)后的第二个printf。 我不知道打印有两位数。我知道第二个数字可能来自while循环中的printf。

1 个答案:

答案 0 :(得分:1)

是的,有3个子进程和1个父进程。孩子们返回4,2,1。

要收集所有状态,您可以使用while循环:

if(pid)
{
  while (waitpid(-1, &status, 0) != -1) /* ignoring signals, errors */
    counter += WEXITSTATUS(status);
}
return counter;

在这种情况下,Parent返回7。

如果您只使用两次waitpid()来电,那么他们可能会从{4,2,1}设置中返回任意一对,例如{4,1}{2,1},以便父母打印;5和{相应地{1}}。

由于stdio缓冲和;3交互,输出可能会倍增。见printf anomaly after “fork()”

fork()之前fflush()或儿童使用fork()