fork system命令创建多个意外的进程数

时间:2013-10-23 11:26:55

标签: c

   #include <unistd.h>
   int main()
    { 
      fork();
      fork() && fork() || fork();
      fork();  
      printf(“forked\n”);
      return 0;
    }

请帮我理解这个程序。为什么要打印20次?

3 个答案:

答案 0 :(得分:1)

现在请记住,每个fork()调用都会导致创建一个新进程,并且一个进程中的返回值为0,另一个进程中的正值(pid,但这与此无关)。所以如果你有代码

fork(); fork(); fork();

你最终得到8个进程。原始的一个,由第一个fork创建的子,然后是这两个,由第二个fork(现在总共4个)创建的子,然后对于所有这四个,由第3个fork创建的另一个子。

然后考虑代码的澄清版本:

#include <unistd.h>
#include <stdbool.h> // to have bool type for correct code
int main()
{ 
    fork();

    // (fork() && fork()) || fork() opened up
    {
        bool tmp = fork(); // 0 implicitly cast to false, nonzero to true
        if (tmp) {
            tmp = fork();
        }
        if (!tmp) {
            tmp = fork();
        }
    }

    fork();  
    printf(“forked\n”);
    return 0;
}

因此,这会产生最多20个进程,每个进程最终都会到达printf。如果你想要大脑练习,用调试器做这件事,你可以在脑海中完成这项任务(使用纸和笔来帮助),这要归功于所有的问题。

答案 1 :(得分:1)

每个fork基本上都会导致两个进程。

在表达式fork() && fork() || fork();中,不会执行每个fork()调用。

fork()调用在调用者进程中返回che子级的PID,并在新子进程中返回0。

如果在任何进程A中执行此行,则第一行将导致一个新进程B.该进程在两个进程中继续。第二个将在A中执行,但不在B中执行。因此A获得一个新的孩子C.第三个在B和C中执行,但不在A中执行,导致D和E.

所以我们为这一行获得了5个进程。

这一行在2个进程中执行,因为单行上的前一个fork();会导致它们。

现在我们有10个进程,每个进程执行最后的fork();,以便我们获得20个进程。

而不是

printf("forked\n");

你可以做到

printf("forked %d <- %d\n", getpid(), getppid());

查看流程之间的关系。

答案 2 :(得分:0)

参考:

http://www.geeksforgeeks.org/fork-and-binary-tree/

请记住, - fork()在子进程中返回0,在父进程中返回非零(子进程PID)。条件运算符是简写。