分叉过程中的输出不同

时间:2015-02-18 09:53:13

标签: c linux process fork pid

我在下面附带的代码中获得了不同数量的输出。有时它打印6个PID或有时8个PID。 所需的输出是7 PID&#39> 。虽然有时我能够得到7个PID。

流程树:

          A
       /  |  \
      B   C   D
     / \  |
    E   F G

我的代码:

#include <stdio.h>

void main()
{
    int pidb=-1;
    if(fork()==0) pidb=getpid();
    fork();
    if(getppid()!=pidb) fork(); 
    printf("%d\n",getpid());
}

注意:假设fork调用成功。

[更新]

我们需要使用3个fork调用来实现它。

2 个答案:

答案 0 :(得分:1)

您忘记包含所需的头文件。要使用fork(),您需要

   #include <sys/types.h>
   #include <unistd.h>

有了这个,我就能得到预期的输出。

也就是说,在您的代码中,您似乎不等待完成子进程。

您需要在父进程中进行wait()调用,以等待子进程执行完毕。

此外,它不是void main(),实际上是int main(void)。最后return 0是一种很好的做法。

答案 1 :(得分:1)

#include <stdio.h>

    void main()
    {
        int pidb=-1;
        if(fork()==0) pidb=getpid();
        fork();
        if(getppid()!=pidb) fork();
        wait(NULL);  // Wait for all child process
        printf("%d\n",getpid());
    }

这就是你想要的。 这将打印7个进程的7 pid


最终的流程树就像这样

          A (First fork) 
       /    \
      B      c   (2nd fork) 
     / \     / \
    D   E    F  G  (3rd fork)
   / \  / \  /\   | 
   1  2 3 4  5 6  7