使用 Fork() 创建进程
Process Creation Using Fork()
在 运行 下面的代码:
#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;
}
我得到以下输出:
p0: x = 1
p1: x = 1
p2: x = 3
p3: x = 3
p4: x = 2
p5: x = 2
我不太明白这些值是如何递增的以及在何处递增。 原始进程 (p0) 执行 main() 函数。第一个 fork() 创建一个
子进程 (p1)。然后 p0 和 p1 都将它们的 x 副本设置为 1。
接下来,两个进程在第二个 fork 上创建另一个子进程 (p2 和 p3)。两个新的子进程 p2
并且 p3 增加他们的 x 副本,即他们的 x 副本变为 2。但是p0和p1呢?他们不增加价值吗?
下一步是什么? p4 和 p5 的值是如何递增的?有人可以解释一下步骤吗?
我认为造成您误解的关键在于 fork 系统调用的 return 值。
调用 fork 时,它 return 为新创建的进程(又名子进程)和旧进程(又名父进程)设置了不同的值。
在子进程中,fork returns 0.
在父进程中,fork return子进程的PID。
比如写if (fork())
时,父进程会进入if子句,子进程不会。它也以另一种方式工作 - 当写 if (!fork())
时,子进程将进入 if 子句,但父进程不会。
fork
returns 以下之一:
-1
出错(并设置 errno
)。
0
中子
- 父项中子项的 pid(真值)。
假设 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
}
}
在 运行 下面的代码:
#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;
}
我得到以下输出:
p0: x = 1
p1: x = 1
p2: x = 3
p3: x = 3
p4: x = 2
p5: x = 2
我不太明白这些值是如何递增的以及在何处递增。 原始进程 (p0) 执行 main() 函数。第一个 fork() 创建一个 子进程 (p1)。然后 p0 和 p1 都将它们的 x 副本设置为 1。
接下来,两个进程在第二个 fork 上创建另一个子进程 (p2 和 p3)。两个新的子进程 p2 并且 p3 增加他们的 x 副本,即他们的 x 副本变为 2。但是p0和p1呢?他们不增加价值吗?
下一步是什么? p4 和 p5 的值是如何递增的?有人可以解释一下步骤吗?
我认为造成您误解的关键在于 fork 系统调用的 return 值。 调用 fork 时,它 return 为新创建的进程(又名子进程)和旧进程(又名父进程)设置了不同的值。
在子进程中,fork returns 0.
在父进程中,fork return子进程的PID。
比如写if (fork())
时,父进程会进入if子句,子进程不会。它也以另一种方式工作 - 当写 if (!fork())
时,子进程将进入 if 子句,但父进程不会。
fork
returns 以下之一:
-1
出错(并设置errno
)。0
中子- 父项中子项的 pid(真值)。
假设 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
}
}