要计算 ( fork() && fork() || fork()
) 之后的进程数,请记住:
在运算符优先级的情况下,我们可以这样写:
(fork() && fork()) || fork()
还要记住,fork 将NON ZERO返回给parent并将ZERO返回给child
为了简化解释,我们重命名:
fork() && fork()
操作A
和最后的 fork()操作 B,所以前面的行相当于:
( fork() && fork()) || fork()
=> A || B
第一行( fork
) :
---> 2 个进程(父亲和孩子1)
第二行:
第一个叉=>
父亲会给孩子 =>父亲(Child2 的 PID)和Child2(零) Child1
会给孩子 => Child1( Child3 的 PID)和Child3(零)
我们有4 个进程:父亲(Child2 的 PID)、Child2(零)、Child1(Child3 的 PID)和 Child3(零)
( && fork()
) 将仅对返回 NON ZERO => Father and Child1的最后一个操作执行
父亲将给一个孩子 =>父亲(Child4 的 PID)和Child4(零) Child1
将给一个孩子 => Child1( Child5 的 PID)和Child5(零)
我们总结一下:
我们有6 个流程:
父亲(Child4 的 PID)、Child4(零)、Child1(Child5 的 PID)、Child5(零)、Child2(零)和 Child3(零)
仅对返回 ZERO =>从 A Operation 返回 ZERO的最后一个命令执行,相关进程是:
Child4(零)、Child5(零)、Child2(零)和 Child3(零)
当分叉这 4 个进程时,我们以 4 个新进程结束 =>Total number of process after second line = 10
第三行:这只是一个简单的分叉
=>进程总数 = 20
为了证明这一点:使用 this ( fork_quiz.c
)
#include <unistd.h>
#include <stdio.h>
int main(int argc, char **argv)
{
fork();
fork() && fork() || fork();
fork();
sleep(10);
return 0;
}
并编译它:
gcc -Wall fork_quiz.c -o fork_quiz
并像这样运行它:
toc@UnixServer:~$ ./fork_quiz & (sleep 1; ps -o "%P%p%c")
[1] 15455
PPID PID COMMAND
15046 15047 bash
15047 15455 fork_quiz
15047 15456 bash
15455 15457 fork_quiz
15455 15458 fork_quiz
15455 15459 fork_quiz
15455 15460 fork_quiz
15457 15462 fork_quiz
15457 15463 fork_quiz
15457 15464 fork_quiz
15458 15465 fork_quiz
15458 15466 fork_quiz
15459 15467 fork_quiz
15459 15468 fork_quiz
15465 15469 fork_quiz
15467 15470 fork_quiz
15463 15471 fork_quiz
15463 15472 fork_quiz
15462 15473 fork_quiz
15462 15474 fork_quiz
15473 15475 fork_quiz
15471 15476 fork_quiz
15456 15477 ps