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

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

4

3 回答 3

1

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

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

你最终有 8 个进程。原始一个,第一个叉子创建的孩子,然后对于这两个,第二个叉子创建一个孩子(现在总共 4 个),然后对于所有 4 个,第三个叉子创建一个孩子。

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

#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. 确切地说,如果你想要大脑练习,你可以在头脑中完成它(使用纸和笔来帮助),由于所有的叉子,使用调试器进行练习是徒劳的。

于 2013-10-23T11:30:10.970 回答
1

本质上,每个分叉都会导致两个进程。

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

调用在fork()调用者进程中返回,PID 为 che child,在新子进程中返回 0。

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

所以我们得到这条线的 5 个进程。

此行在 2 个进程中执行,因为前面fork();的单行导致它们。

现在我们有 10 个进程,每个进程都执行 final fork();,这样我们就得到了 20 个进程。

代替

printf("forked\n");

你可以做

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

查看进程之间的关系。

于 2013-10-23T11:37:36.200 回答
0

参考这个:

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

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

于 2013-10-23T11:36:06.077 回答