C中分叉的输出

Output of Forking in C

给定 PID = 4224 为什么我得到以下代码片段的输出:

x = 10922 y = 0 我是进程:10923 x = 0 y = 2 我是进程:10922 x = 0 y = 2 我是进程:10922 x = 0 y = 0 我是进程:10924

对于此代码:

#include <iostream>
#include <stdio.h>
#include <unistd.h>
int main() {
    int x = 1, y = 2;
    int pid;
    x=fork();
    if(x==0){
        printf("x = %d y = %d\n", x, y);
        pid = getpid();
        printf("I am process: %d\n", pid);
    }
    y  = fork();
    if(y==0){
        printf("x = %d y = %d\n", x, y);
        pid = getpid();
        printf("I am process: %d\n", pid);
    }
    return 0;
}

让我们从这个开始,程序的输出:

x = 0 y = 2     
I am process: 330161
x = 330161 y = 0
I am process: 330162
x = 0 y = 0
I am process: 330163

请注意,顺序与您的略有不同。这是因为哪个进程先运行取决于环境。因此,让我们稍微修改一下您的程序,使其更加清晰:

#include <stdio.h>
#include <unistd.h>
int main() {
    int x = 1, y = 2;
    int pid;
    x=fork();
    if(x==0){
        pid = getpid();
        printf("1:x = %d y = %d I am process %d\n", x, y, pid);
    }
    fflush(NULL);
    y  = fork();
    if(y==0){
        pid = getpid();
        printf("2:x = %d y = %d I am process %d\n", x, y, pid);
    }
    return 0;
}

通过将printfs 和一个换行符放在一起,我们可以放心每条语句属于一个进程,它们不会交错。 通过在 1:, 2: 行的开头添加一个指示符,我们知道它们来自哪个 printf() 。 fflush() 阻止 child 进程从 stdio 继承任何部分缓冲的写入——如果您在终端上,这不是问题,但如果您重定向到一个文件,您可能会发现重复的行。所以我系统上的输出看起来像:

1:x = 0 y = 2 I am process 330214
2:x = 330214 y = 0 I am process 330215
2:x = 0 y = 0 I am process 330216

据此,主进程的第一个child进程是330214。第二个是330215; grand-child(child 的 child)是 330216。 我希望这能给你足够的答案。

不要害怕使用这些示例程序。这是了解系统工作原理的好方法。