int main()
{
fork();
fork() && fork() || fork();
fork();
printf("forked\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我们调用fork函数时,父级得到一个非零pid,而子级得到一个0作为回报基于这个逻辑,在第二个语句中我们将不得不应用短路原理(afaik)....打电话会有2个过程,
在第二行之后,8个进程,[父进程在(fork()&& fork()中分叉两次),第二个子进程因" fork()|| fork() " 而得到两次
最后16(根据我的推理)
如果这是正确的或涉及其他一些逻辑,请告诉我
要计算(fork() && fork() || fork()
)之后的进程数,请记住:
In(&&
)逻辑运算符:仅当左侧为NON ZERO时才评估右侧
在(||
)逻辑运算符:右侧被评估仅当左侧是ZERO
并且运算符优先级我们就像这样写:
(fork() && fork()) || fork()
还要记住,fork将NON ZERO返回给父级,将ZERO返回给子级
为简化说明,我们重命名:
fork() && fork()
操作A.
和最后一个fork()操作B,所以先行行相当于:
(fork() && fork()) || fork()
=> A || B.
第一行(fork
):
---> 2过程(父亲和孩子1)
第二行:
第一个叉=>
父亲将给孩子=> 父亲(Child2的PID)和Child2(ZERO)Child1 将给孩子=> Child1(Child3的PID)和Child3(ZERO)
我们有4个进程:父亲(Child2的PID),Child2(ZERO),Child1(Child3的PID)和Child3(ZERO)
(&& fork()
)仅对返回NON ZERO => Father和Child1的最后一个操作执行
父亲wille给孩子=> 父亲(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 => 从A操作返回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;
}
Run Code Online (Sandbox Code Playgroud)
并编译它:
gcc -Wall fork_quiz.c -o fork_quiz
Run Code Online (Sandbox Code Playgroud)
并运行它:
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
Run Code Online (Sandbox Code Playgroud)