2017-03-08 60 views
2

我想了解下面的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?如果是这样以及为什么?

+1

对于最后一个问题,仅仅因为创建了一个新进程,它不必立即开始运行。父进程仍然可以运行,并且由于您有多个其他进程,其中一个进程可以在其他进程打印前轻松打印2和3. –

+1

呵呵,请不要使用多种语言标记,除非您正在比较语言的功能标签。只使用你实际编程的语言(本例中是C++)。 –

+0

树中的数字代表什么? 每个节点都是一个进程? 此外,如果这有助于1将被打印两次2次。 2将被打印4次,3 - > 8,4 - > 16 并且程序将为您制作的程序调用生成15个新进程+1。 – user183833

回答

1

根据我的理解程序会产生16个进程我是对吗?

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

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

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

最后一个分支导致十六个进程在运行。这比你刚开始的时候多了15倍,总体来说,叉子创造了15个新的流程。

是否可以在2之前输出3?如果是这样以及为什么?

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

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

但是:

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

有此进程后运行的四个过程。没有任何东西能够保证所有人都会在他们或他们的后代打印“3”之前打印出“2”。

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

但是在这些“3”之前必须有其他的“2”。

0

按我的理解,程序会生成16个进程是吗?

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

是否可以在2之前输出3?如果是这样以及为什么?

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

+0

正如我在评论中表示的那样,并且是迂腐(对不起:P),程序将生成15个新进程,另外一个将是用户调用的进程。 – user183833

+0

@ user183833,够公平的。 –