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

时间:2012-08-12 14:23:49

标签: c unix

int main()
{
fork();
fork() && fork() || fork();
fork();

printf("forked\n");
return 0;
}

当我们调用fork函数时,父级获取非零pid ,而子级获得0 作为回报 基于这个逻辑,在第二个声明中,我们将必须应用短路(afaik)的原则.... 第一次通话后,将有2个进程,

在第二行之后,8个进程,[父级在( fork()&& fork()中分叉两次),第二个孩子也因为“ fork()|| fork()“]

最后16(根据我的推理)

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

2 个答案:

答案 0 :(得分:7)

要计算(fork() && fork() || fork())之后的流程数,请记住:

  • 在(&&)逻辑运算符中:右侧仅在左侧为 NON ZERO

    时评估 LI>
  • 在(||)逻辑运算符中:右侧仅在左侧 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)

  • B操作

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