我试图理解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;
}
我上面程序的流程结构是这样的,我的假设是否正确?
parent(x)
/ | | \
1 2 3 4
/ | \ / \ |
2 3 4 3 4 4
/ \ | |
3 4 4 4
|
4
根据我的理解,该计划将生成16个流程,我是对吗?
可以在2之前输出3吗?如果是这样,为什么?
答案 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
。