为什么分叉时 pid0 会打印两次并带有一个值?
Why does pid0 get printed twice with a value when forking?
我很难理解为什么变量 pid0 使用实际 ID 打印了两次。据我了解,第一次后所有分叉进程的 pid0 都将设置为 0。
这是我的主要功能:
int main() {
pid_t pid0, pid1, pid2;
pid0 = fork();
pid1 = fork();
if (pid0 == 0) pid2 = fork();
printf("pid0: %d, pid1: %d, pid2: %d\n", pid0, pid1, pid2);
return 0;
}
这是输出:
pid0: 3388, pid1: 3389, pid2: 32766
pid0: 3388, pid1: 0, pid2: 32766
pid0: 0, pid1: 3390, pid2: 3391
pid0: 0, pid1: 0, pid2: 3392
pid0: 0, pid1: 3390, pid2: 0
pid0: 0, pid1: 0, pid2: 0
您的第一个 fork()
创建了第二个进程。你的第二个运行在两个进程上,然后你有四个进程。其中两个 pid0
设置为 0
,另外两个没有。
原来的分叉进程 (pid0 === 0
) 及其克隆都将再次调用 fork()
,因此还有两个进程,总共六个。
这四颗是原fork()
树的一部分,还有两颗也在二级树中(pid1 == 0
)。
如果您只需要一个父进程,则必须关闭第二个 fork()
并在 pid0
非零时避免这样做。
请注意输出的第二行有 pid1: 0
,表明它是一个克隆。
fork之后,父子都继续执行下面的代码。
让我们调用原始进程P
,以及用pid0 = fork()
创建的子进程P-C1
。然后这两个进程都执行 pid1 = fork()
。然后我们还有两个进程,我称之为 P-C2
和 P-C1-C3
.
现在所有 4 个进程都执行 if
语句。 pid0
在P-C1
和P-C1-C3
中都是0
,所以他们都执行pid2 = fork()
。这将创建进程 P-C1-C4
和 P-C1-C3-C5
,并且它们继承了 pid0
.
的零值
完成所有这些后,我们在进程 P-C1
、P-C1-C3
、P-C1-C4
和 P-C1-C3-C4
中有 pid0 = 0
。并且 pid0 != 0
在进程 P
和 P-C2
中。
所有 6 个进程然后打印 pid0
。
我很难理解为什么变量 pid0 使用实际 ID 打印了两次。据我了解,第一次后所有分叉进程的 pid0 都将设置为 0。
这是我的主要功能:
int main() {
pid_t pid0, pid1, pid2;
pid0 = fork();
pid1 = fork();
if (pid0 == 0) pid2 = fork();
printf("pid0: %d, pid1: %d, pid2: %d\n", pid0, pid1, pid2);
return 0;
}
这是输出:
pid0: 3388, pid1: 3389, pid2: 32766
pid0: 3388, pid1: 0, pid2: 32766
pid0: 0, pid1: 3390, pid2: 3391
pid0: 0, pid1: 0, pid2: 3392
pid0: 0, pid1: 3390, pid2: 0
pid0: 0, pid1: 0, pid2: 0
您的第一个 fork()
创建了第二个进程。你的第二个运行在两个进程上,然后你有四个进程。其中两个 pid0
设置为 0
,另外两个没有。
原来的分叉进程 (pid0 === 0
) 及其克隆都将再次调用 fork()
,因此还有两个进程,总共六个。
这四颗是原fork()
树的一部分,还有两颗也在二级树中(pid1 == 0
)。
如果您只需要一个父进程,则必须关闭第二个 fork()
并在 pid0
非零时避免这样做。
请注意输出的第二行有 pid1: 0
,表明它是一个克隆。
fork之后,父子都继续执行下面的代码。
让我们调用原始进程P
,以及用pid0 = fork()
创建的子进程P-C1
。然后这两个进程都执行 pid1 = fork()
。然后我们还有两个进程,我称之为 P-C2
和 P-C1-C3
.
现在所有 4 个进程都执行 if
语句。 pid0
在P-C1
和P-C1-C3
中都是0
,所以他们都执行pid2 = fork()
。这将创建进程 P-C1-C4
和 P-C1-C3-C5
,并且它们继承了 pid0
.
完成所有这些后,我们在进程 P-C1
、P-C1-C3
、P-C1-C4
和 P-C1-C3-C4
中有 pid0 = 0
。并且 pid0 != 0
在进程 P
和 P-C2
中。
所有 6 个进程然后打印 pid0
。