2014-10-05 49 views
1

我有一个用C编写的linux程序。它的目的是检查fork()调用的行为和由此产生的子进程C-fork()和进程行为

第一次检查时,一切似乎都很简单。然而

  1. 有时候输出是写在一个有趣的顺序
  2. 有时孩子PPID为“1”没有任何父PID是。

我无法找到任何模式或时间之间的相关性,当它按预期工作,当它没有。

我认为第2点可能是由父进程在子进程完全执行之前死亡引起的。如果是这样,是否有办法阻止这种情况发生。

但是我不知道是什么原因造成点下方1

代码:

#include <stdio.h> 
#include <unistd.h> 

int main() 
{ 

int x = fork(); 

if (x == 0) 
{ 
    printf("Child:"); 
    printf ("\nChild PID : %d", getpid()); 
    printf ("\nChild PPID: %d", getppid()); 
    printf("\nHello Child World\n"); 
} 

if (x != 0) 
{ 
    printf("Parent :"); 
    printf ("\nParent PID : %d", getpid()); 
    printf ("\nParent PPID: %d", getppid()); 
    printf("\nHello Parent World\n"); 
} 

return 0; 

}

+0

输出顺序不能由普通程序控制 - 这就是并行处理的要点 - CPU同时执行两个进程。所以输出通常是相互补间的。 – 2014-10-05 13:13:39

+0

谢谢,写作答案,我可以接受。还有什么原因导致孩子成为1,而不是父母是什么? – user3001499 2014-10-05 13:17:02

回答

2

行为的说明1第一时开始:

  • 输出的顺序不能由程序正常控制。这是并行过程的要点。操作系统决定在任何时间点执行哪个进程,并且两个进程同时执行(对人眼)。
  • 因此,输出通常会相互补间。

行为2的说明:

  • 你猜对不对。
  • 父进程在分叉之前完成。
  • 如果您需要父pid,则可以在父进程中使用waitpid(x, &status, 0),前提是您需要父级保持活动状态直到执行子级。 This link可能会帮助你。
3

这种行为是因为操作系统的调度策略的观察。如果您知道os的流程管理概念,那么如果您的父代码正在运行并且遇到fork(),则会创建child,但如果在此时间内父代的时间片尚未完成,则父代继续运行,并且如果在它的时间片,父节点执行并终止,然后子节点成为孤儿进程,并且在父进程的时间片完成后,子节点的执行开始,这就是为什么getppid()函数返回1,因为child是一个孤儿进程,它现在被init进程采用其中操作系统启动并具有进程ID为1