fork()理解,关于执行和子代

时间:2015-05-08 16:35:47

标签: unix parallel-processing fork

我刚开始fork(),我在理解并行执行方面遇到了一些困难。我找到了这个示例代码,我想知道它是第一次进入true还是false(我知道pid1==0是否意味着它是一个孩子,等等)。我还想知道有多少副本(将创建子项)和一般执行的一些细节。

我试图运行它并添加return 0;(我的原始来源没有它)只是为了查看是否退出...但是你可以看到它“等待”

http://i.imgur.com/D3XEFgs.png

int main(void)
{
    int pid1, pid2, pid3, pid4;
    pid1=fork();
    if (pid1!=0) 
    { 
        pid2=fork(); 
        pid3=fork(); 
        printf("\t\t IF(TRUE) pid1=%d and pid2=%d and pid3=%d\n",
               pid1, pid2, pid3);
    }
    else
    {
        pid4=fork();  
        printf("\nIF(False) FATHER is talking with pid1=%d and pid4=%d\n",
               pid1, pid4);
    }
    return 0;
}

2 个答案:

答案 0 :(得分:0)

首次使用true和false。

fork()复制程序(创建1个子项),两个程序从该点继续执行。子进程将占用一个分支,而父进程将占用另一个分支。

fork()的数量如下:

您从1个流程开始

pid1之后 - > +1进程

家长分会<​​/ strong>

pid4之后 - &gt; +1进程

儿童科

pid2之后 - &gt; +1进程

新创建的流程同时为fork()运行pid3,因此在pid3 - &gt;之后+2个过程

你得到5个孩子+原始过程。

答案 1 :(得分:0)

此程序创建五个后代进程,并对printf进行六次调用,其中四个将是IF(TRUE)消息,两个将是IF(FALSE)。这是控制流程的ASCII艺术图;每次分支时,双方都会被执行,父母直接向下,孩子向右。这些数字是初始化forkpid1,...变量的pid2次调用,字母T和F是IF(TRUE)IF(FALSE)消息,以及_是函数末尾的return 0。这个程序不等任何事情;所有控制流路径最终都会到达return 0

|
1
|\------\
2       4
|\--\   |\
3   3   | |
|\  |\  | |
T T T T F F
| | | | | |
_ _ _ _ _ _

输出消息可能出现在任何顺序中。在所有后代进程写入消息之前,最顶层的父进程可能会退出(将控制权返回给shell),因此(在screeenshot中可见)shell提示可能会混淆消息也是。

请注意,根据消息文本,您的if条件向后:pid1 != 0父级中为真,而不是子级。