C-fork()和进程行为
问题描述:
我有一个用C编写的linux程序。它的目的是检查fork()
调用的行为和由此产生的子进程C-fork()和进程行为
第一次检查时,一切似乎都很简单。然而
- 有时候输出是写在一个有趣的顺序
- 有时孩子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;
}
答
行为的说明1第一时开始:
- 输出的顺序不能由程序正常控制。这是并行过程的要点。操作系统决定在任何时间点执行哪个进程,并且两个进程同时执行(对人眼)。
- 因此,输出通常会相互补间。
行为2的说明:
- 你猜对不对。
- 父进程在分叉之前完成。
- 如果您需要父pid,则可以在父进程中使用
waitpid(x, &status, 0)
,前提是您需要父级保持活动状态直到执行子级。 This link可能会帮助你。
答
这种行为是因为操作系统的调度策略的观察。如果您知道os的流程管理概念,那么如果您的父代码正在运行并且遇到fork(),则会创建child,但如果在此时间内父代的时间片尚未完成,则父代继续运行,并且如果在它的时间片,父节点执行并终止,然后子节点成为孤儿进程,并且在父进程的时间片完成后,子节点的执行开始,这就是为什么getppid()函数返回1,因为child是一个孤儿进程,它现在被init进程采用其中操作系统启动并具有进程ID为1
输出顺序不能由普通程序控制 - 这就是并行处理的要点 - CPU同时执行两个进程。所以输出通常是相互补间的。 – 2014-10-05 13:13:39
谢谢,写作答案,我可以接受。还有什么原因导致孩子成为1,而不是父母是什么? – user3001499 2014-10-05 13:17:02