这是创建的子进程的正确数量吗?
Would this be the correct number of child processes created?
我知道总数了。创建的子进程数是 6,但我不太确定这是否正确。如果不正确,有人可以指出我正确的方向。我插入了一个粗略的草图,说明我是如何收到答案的。
void main() {
int pid = fork();
if(pid == 0)
fork();
pid = fork();
if(pid != 0)
fork();
exit(0);
}
你最终应该有 9 个进程。
int main() { // |
int pid = fork(); // +-----+
if(pid == 0) // | |
fork(); // +-----+
pid = fork(); // +---+ +---+ +---+
if(pid != 0) // | | | | | |
fork(); // +-+ +-+ +-+
return 0; // | | | | | | | | |
}
在 int pid = fork();
中,您将进程数量加倍,其中一种情况是 pid == 0
,另一种情况是 pid != 0
。其中一个在两行之后再次翻倍。所以在第一部分之后你总共有 3 个进程。
从 pid = fork();
开始,它不会判断进程是父进程还是子进程,因为您重新分配了 pid
。在第 2 部分中,您再次将总量增加三倍,因此总共有 9 个流程。
其中 3 个 pid = fork();
返回了 0,其中 6 个(来自这一行和最后 fork()
的子进程)有 pid != 0
.
我在 main() 的末尾添加了 pause():
#include <unistd.h>
#include <stdlib.h>
void main(void) {
int pid = fork();
if(pid == 0)
fork();
pid = fork();
if(pid != 0)
fork();
pause();
exit(0);
}
我编译执行了。在另一个终端中,我使用了 pstree:
$ pstree -p -h 11052
a.out(11052)-+-a.out(11053)-+-a.out(11056)-+-a.out(11058)
| | `-a.out(11060)
| |-a.out(11057)
| `-a.out(11059)
|-a.out(11054)
`-a.out(11055)
我知道总数了。创建的子进程数是 6,但我不太确定这是否正确。如果不正确,有人可以指出我正确的方向。我插入了一个粗略的草图,说明我是如何收到答案的。
void main() {
int pid = fork();
if(pid == 0)
fork();
pid = fork();
if(pid != 0)
fork();
exit(0);
}
你最终应该有 9 个进程。
int main() { // |
int pid = fork(); // +-----+
if(pid == 0) // | |
fork(); // +-----+
pid = fork(); // +---+ +---+ +---+
if(pid != 0) // | | | | | |
fork(); // +-+ +-+ +-+
return 0; // | | | | | | | | |
}
在 int pid = fork();
中,您将进程数量加倍,其中一种情况是 pid == 0
,另一种情况是 pid != 0
。其中一个在两行之后再次翻倍。所以在第一部分之后你总共有 3 个进程。
从 pid = fork();
开始,它不会判断进程是父进程还是子进程,因为您重新分配了 pid
。在第 2 部分中,您再次将总量增加三倍,因此总共有 9 个流程。
其中 3 个 pid = fork();
返回了 0,其中 6 个(来自这一行和最后 fork()
的子进程)有 pid != 0
.
我在 main() 的末尾添加了 pause():
#include <unistd.h>
#include <stdlib.h>
void main(void) {
int pid = fork();
if(pid == 0)
fork();
pid = fork();
if(pid != 0)
fork();
pause();
exit(0);
}
我编译执行了。在另一个终端中,我使用了 pstree:
$ pstree -p -h 11052
a.out(11052)-+-a.out(11053)-+-a.out(11056)-+-a.out(11058)
| | `-a.out(11060)
| |-a.out(11057)
| `-a.out(11059)
|-a.out(11054)
`-a.out(11055)