【问题标题】:C - fork() and processes behaviourC - fork() 并处理行为
【发布时间】:2014-11-29 22:09:59
【问题描述】:

我有一个在 linux 上用 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;

}

【问题讨论】:

  • 普通程序无法控制输出的顺序——这就是并行处理的意义——CPU同时执行两个进程。所以输出通常是中间补间的。
  • 谢谢,写为答案,我可以接受。还有什么原因导致子 ppid 为 1,而不是父 pid 是什么?

标签: c fork pid


【解决方案1】:

行为1解释:

  • 程序无法正常控制输出顺序。这就是并行过程的意义所在。操作系统决定在任何时间点执行哪个进程,并且两个进程同时执行(在人眼看来)。
  • 因此,输出通常会在中间进行补间。

行为2解释:

  • 你猜对了。
  • 父进程在派生进程之前完成。
  • 如果你想要父进程的pid,你可以在父进程中使用waitpid(x, &amp;status, 0),如果你需要父进程保持存活直到子进程执行。 This link 可以帮到你。

【讨论】:

    【解决方案2】:

    由于操作系统的调度策略,可以看到此行为。如果您了解 os 的进程管理概念,那么如果您的父代码正在运行并且遇到 fork(),则创建子代码,但如果在此时间内,父代码的时间片尚未完成,则父代码继续运行,如果在它的时间片,父进程执行并终止,然后子进程成为孤立进程,在父进程的时间片完成后,子进程开始执行,这就是 getppid() 函数返回 1 的原因,因为子进程是一个孤立进程,它现在被 init 进程采用它在操作系统启动时首先启动并且进程 ID 为 1。

    【讨论】:

      猜你喜欢
      • 2011-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-13
      • 1970-01-01
      • 2010-12-29
      相关资源
      最近更新 更多