int main()
{
fork();
fork() && fork() || fork();
fork();
printf("forked\n");
return 0;
}
当我们调用fork函数时,父级获取非零pid ,而子级获得0 作为回报 基于这个逻辑,在第二个声明中,我们将必须应用短路(afaik)的原则.... 第一次通话后,将有2个进程,
在第二行之后,8个进程,[父级在( fork()&& fork()中分叉两次),第二个孩子也因为“ fork()|| fork()“]
最后16(根据我的推理)
如果这是正确的或涉及其他一些逻辑,请告诉我
答案 0 :(得分:7)
要计算(fork() && fork() || fork()
)之后的流程数,请记住:
在(&&
)逻辑运算符中:右侧仅在左侧为 NON ZERO
在(||
)逻辑运算符中:右侧仅在左侧 ZERO
使用运算符优先级我们就像这样编写:
(fork() && fork()) || fork()
还要记住,fork将 NON ZERO 返回父级, ZERO 返回子级
为简化说明,我们重命名:
fork() && fork()
操作 A
和最后一个fork()操作B,所以先行行相当于:
(fork() && fork()) || fork()
=> A || B
第一行(fork
):
---> 2进程(父和 Child1 )
第二行:
第一个分叉=>
父亲会给孩子=> 父亲(Child2的PID)和 Child2(ZERO) Child1会给孩子=> Child1(Child3的PID)和 Child3(ZERO)
我们有 4进程:父亲(Child2的PID),Child2(ZERO),Child1(Child3的PID)和Child3(ZERO)
(&& fork()
)仅针对返回NON ZERO =>的最后操作执行。 父亲和 Child1
父亲威尔给孩子=> 父亲(Child4的PID)和 Child4(ZERO) Child1会给孩子=> Child1(Child5的PID)和 Child5(ZERO)
让我们总结一下:
我们有 6进程:
父亲(Child4的PID),Child4(ZERO),Child1(Child5的PID),Child5(ZERO),Child2(ZERO)和Child3(ZERO)
仅针对返回ZERO =>的最后一个命令执行从操作返回ZERO的进程,关注进程是:
Child4(ZERO),Child5(ZERO),Child2(ZERO)和Child3(ZERO)
当分叉这4个过程时,我们以4个新进程结束=> Total number of process after second line = 10
第三行: 这只是一个简单的叉子
=> 流程总数= 20
要证明:使用此(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
答案 1 :(得分:1)
让我们重新编写程序来计算生成的进程:
#include <stdio.h>
int my_fork(const char *c) {
int r = fork();
if (!r) {
fprintf(stderr, "process spawned at %s\n", c);
}
return r;
}
int main()
{
my_fork("a");
my_fork("b") && my_fork("c") || my_fork("d");
my_fork("e");
return 0;
}
启动后,您会看到19行process spawned
,因此fork()
调用会产生19个进程:
~$ ./test
process spawned at a
process spawned at c
process spawned at c
process spawned at e
process spawned at e
process spawned at b
process spawned at d
process spawned at d
process spawned at e
process spawned at e
process spawned at e
process spawned at d
process spawned at e
process spawned at e
process spawned at b
process spawned at e
process spawned at d
process spawned at e
process spawned at e
UPD :可以轻松计算出处理数量,并考虑到short-circuit boolean evaluation in C。