在以下程序中将生成多少个进程

Dil*_*nte 2 c unix

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(根据我的推理)

如果这是正确的或涉及其他一些逻辑,请告诉我

TOC*_*TOC 7

要计算(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 => FatherChild1的最后一个操作执行

父亲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)

  • B操作:

仅对返回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)