x89*_*x89 -1 c unix linux fork system-calls
在运行以下代码时:
#include <stdio.h>
#include <unistd.h>
static int x = 0;
int main(int argc, char *argv[])
{
pid_t p = getpid();
fork();
x++;
if (! fork()) {
x++;
if (fork()) {
x++;
}
}
printf("p%d: x = %d\n", getpid() - p, x);
sleep(60);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我得到以下输出:
p0: x = 1
p1: x = 1
p2: x = 3
p3: x = 3
p4: x = 2
p5: x = 2
Run Code Online (Sandbox Code Playgroud)
我不太明白这些值是如何以及在哪里增加的。的原始处理(P0)执行main()函数。第一个 fork() 创建一个 子进程 (p1)。然后,p0 和 p1 都将它们的 x 副本设置为 1。
接下来,两个进程在第二个 fork 上创建另一个子进程(p2 和 p3)。两个新的子进程 p2 和 p3 递增它们的 x 副本,即它们的x副本变为 2。但是p0 和 p1呢?他们不增加值吗?
下一步是什么?p4 和 p5的值如何递增?有人可以解释一下吗?
fork 返回以下之一:
-1在错误(和集errno)。0 在孩子。假设fork没有失败,这意味着!fork()仅在子级中fork()为真,并且仅在父级中为真。
p0 p1 p2 p3 p4 p5
-- -- -- -- -- --
static int x = 0; x = 0
// p1 created as a copy of p0.
fork(); 0 0
x++; 1 1
// p2 created as a copy of p0.
// p3 created as a copy of p1.
if (! fork()) { 1 1 1 1
// Only p2 and p3 reach here.
x++; 1 1 2 2
// p4 created as a copy of p2.
// p5 created as a copy of p3
if (fork()) { 1 1 2 2 2 2
// Only p2 and p3 reach here.
x++; 1 1 3 3 2 2
}
}
Run Code Online (Sandbox Code Playgroud)