4

如果我运行以下代码:

#include <stdio.h>
#include <unistd.h>

int main()
{
    pid_t pid, pid1;
    fflush(stdout);
    pid = fork();
    fflush(stdout); 
    pid1 = fork();
    if(pid==0)
    {
         printf("%d is the first child\n", getpid() );
    }
    else if(pid>0)
    {
         printf("%d is the first parent\n", pid);
        wait();
    }
    if(pid1==0)
    {
         printf("%d is the second child\n", getpid() );
    }
    else if(pid1>0)
    {
         printf("%d is the second child\n", pid1);
        wait();
    }

    return 0;
}

我得到输出:

2896 is the first parent
2896 is the first child
2898 is the first child
2898 is the second child
2898 is the second child
2896 is the first parent
2897 is the second child
2897 is the second child

我无法理解输出。为什么多次打印相同的字符串?

4

3 回答 3

11

您总共进行了 3 个分叉:首先,pid = fork()在原始流程中完成,导致多了一个流程,所以现在总共是两个,都从代码的下一行继续。

然后pid1 = fork()在这两个上完成,导致另外两个进程,所以现在总数为 4,每个再次继续下一行(第一个 if)。

然后所有三个进程处理两个 if-else 语句(假设没有分叉错误),每个进程打印两行。所以四个进程乘以 2 行是 8 行。你得到的。

所以流程是:

  • 原来的
  • 第一代大孩子,来自第一个 fork 语句
  • 第一代年幼的孩子,来自原版的第二个 fork 声明
  • 第二代子代,来自较年长的第一代子代的第二个 fork 语句

如果您想了解输出,请在您的脑海中逐步完成所有这四个过程的代码。除了现在打印的内容之外,如果您在每个打印语句中打印出当前的 pid 也可能会有所帮助。

于 2013-01-29T13:05:44.527 回答
0

另外我认为您在下面的代码中错误地打印了相同的字符串

else if(pid1>0)
{
    printf("%d is the second child\n", pid1); // This "child" should be "parent"
    wait();
}
于 2016-04-18T11:47:13.977 回答
0

为了更好地理解,您可以为每个进程编写 if/else 块:

    if(pid != 0 && pid1 != 0){
        printf("Parent P\n");//parent
    }else if(pid == 0 && pid1 != 0){
        printf("First child of P\n");
    }else if(pid != 0 && pid1 == 0){
        printf("Second child of P\n");
    }else{
        //pid = 0, pid2 = 0
        printf("Child of the first child of P\n");
    } 
于 2020-09-22T20:23:06.797 回答