任何人都可以解释为什么这个fork执行打印8次我的文本?

时间:2017-02-01 01:05:58

标签: c printf fork

我无法理解为什么它会打印8倍的文字。在我的构思中,它应该只打印2次。 能不能帮助我吗?

代码:

#include <stdio.h>
#include <stdlib.h>
int main(void) {
    pid_t x=0;
    pid_t y=0;
    x=fork();
    if(y>0)
        fork();
    if(x==0)
        y=fork();
    fork();
    if(y==0){
        fork();
        printf("Some text\n");
    }
}

2 个答案:

答案 0 :(得分:4)

x = fork();已执行且正在运行2个进程。

if (y>0) fork();永远不会被执行。

子进程将执行

if (x==0) y=fork();,因此现在有3个进程正在运行。对于初始父级y仍为0。对于孩子而言y == child_child's pid以及孩子的y==0

所有3个进程都将执行fork(),因此共有6个进程,其中4个进程内存y==0

这4个进程再次分叉,因此有8个进程并执行printf(...);

答案 1 :(得分:1)

我修改代码以进行更多调试打印。

#include <stdio.h>
#include <stdlib.h>
#include "unistd.h"
int main() {
    pid_t x=0;
    pid_t y=0;

    printf("FORK X \n");
    x=fork();

    if(y>0) {
        printf("FORK 1 \n");
        fork();
    }

    if(x==0) {
        printf("FORK 2 \n");
        y=fork();
    }

    printf("FORK 3 \n");
    fork();
    if(y==0){
        printf("FORK 4 \n");
        fork();
        printf("Some text\n");
    }
}

这是输出,每个&#34; FORK 4&#34;将导致TWO&#34;一些文字&#34;因为之后有一个分叉:

煎饼:tmp greedy52 $ ./a.out

FORK X 
FORK 3 
FORK 4 
FORK 2 
FORK 4 
Some text
Some text
FORK 3 
FORK 3 
Some text
Some text
FORK 4 
Some text
FORK 4 
Some text
Some text
Some text

4&#34; FORK 4&#34;到达(每个成功的fork()调用创建两个进程A和B):

  1. @ x = fork() - &gt; x!= 0和@FORK 3 fork A
  2. @ x = fork() - &gt; x!= 0和@FORK 3 fork B
  3. @ x = fork() - &gt; x = 0和@ y = fork() - &gt; y = 0和@FORK 3 fork A
  4. @ x = fork() - &gt; x = 0和@ y = fork() - &gt; y = 0和@FORK 3 fork B
  5. @ x = fork() - &gt; x = 0和@ y = fork() - &gt; y!= 0分支没有生成任何&#34;某些文字&#34;。

    FORK X --------> x != 0 -------------------------------> FORK 3 A -----> FORK 4 A (Some text)
              |              |                                          |--> FORK 4 B (Some text)
              |              |
              |              |-----------------------------> FORK 3 B -----> FORK 4 A (Some text)
              |                                                         |--> FORK 4 B (Some text)
              |
              |
              |----> x == 0 -----> FORK 2 A ( y = 0 ) -----> FORK 3 A -----> FORK 4 A (Some text)
                             |                                          |--> FORK 4 B (Some text)
                             |                         |---> FORK 3 B -----> FORK 4 A (Some text)
                             |                                          |--> FORK 4 B (Some text)
                             |
                             |---> FORK 2 B (y != 0 ) -----> FORK 3 A -----> XXX bad end
                                                       |---> FORK 3 B -----> XXX bad end