我试图理解fork()函数序列是如何工作的?

时间:2017-03-08 21:57:50

标签: c++ fork

我试图理解fork()函数的下面序列是如何工作的?

                #include <iostream>
                #include <sys/types.h>
                #include <unistd.h>
                using namespace std;
                int main() {
                  fork();   cout << "1 "  << endl;//calling fork 1
                  fork();   cout << "2 " << endl; // calling fork 2
                  fork();   cout << "3 "  << endl;// calling fork 3

                  fork();   cout<<" 4 "<<endl;//calling fork 4
                  return 0;
                }
  1. 我上面程序的流程结构是这样的,我的假设是否正确?

                                     parent(x)
                                    /       |     |   \
                                   1        2     3    4
                               /   |  \    / \    |
                              2    3   4  3   4   4
                             / \   |      |
                            3   4  4      4
                            |
                            4
    
    • 根据我的理解,该计划将生成16个流程,我是对吗?

    • 可以在2之前输出3吗?如果是这样,为什么?

2 个答案:

答案 0 :(得分:1)

  

根据我的理解,该程序将生成16个进程,我是对吗?

第一个进程将分叉一个新进程。那是一个。现在有两个进程正在运行。

然后,作为第二个分支的结果,这两个进程将再创建两个进程。现在有四个进程在运行。

下一个分支导致八个正在运行的进程。

最后一个fork导致16个进程在运行。这比你开始时要多十五倍,因此,总的来说,这些分支创建了十五个新流程。

  

2之前可以输出3吗?如果是这样,为什么?为什么?

是的,从一个非常孤立的角度来看,它可能会发生。 A 3将永远不会出现在前2个之前,但3可能会跟随2。

为了打印“3”,必须打印“2”。对于单个进程,没有执行路径在“2”之前打印“3”。

可是:

fork();   cout << "2 " << endl; 

此fork之后有四个进程在运行。没有任何东西可以保证所有人在他们或他们的后代打印出他们的“3”之前打印出一个“2”。

例如,操作系统可以优先考虑四个进程中的一个,并且在其他三个进程打印出2,分叉并打印3s之前,它们不会到达cout << "2"。 。现在,在其他进程已经脱口而出“3”后,睡眠过程醒来并打印出“2”。最终结果将是“3”,后跟“2”。

但在“3”之前必须有其他“2”。

答案 1 :(得分:0)

  

根据我的理解,该程序将生成16个进程,我是对吗?

总共将有16个进程。运行程序时,由于调用fork(),将生成15个进程。

  

2之前可以输出3吗?如果是这样,为什么?为什么?

我不这么认为。标准库函数无法控制将分叉进程的输出排序到stdout。因此,它们按照程序无法控制的顺序写入stdout