子进程打印错误的父进程ID()

4
在这个程序中,为什么子进程打印错误的ppid()?
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>

void childprocess()
{
  printf("Child: Hi I am the child process\n");
  printf("Child: My process id is %d\n", getpid());
  printf("Child: My parent is %d\n", getppid());
  printf("Child: I am exiting\n");
}

void parentprocess()
{
   printf("Parent: Hi I am the parent process\n");
   printf("Parent: My process id is %d\n", getpid());
   printf("Parent: My parent is %d\n", getppid());
   printf("Parent: I am exiting\n");
}

int main()
{
    pid_t n = fork();
    if(n<0)
    {
      perror("fork failed:");
      exit(EXIT_FAILURE);
    }
    else if(n==0)
       childprocess();
    else
       parentprocess();
}

输出:

Parent: Hi I am the parent process
Parent: My process id is 21550
Parent: My parent is 7452
Parent: I am exiting
Child: Hi I am the child process
Child: My process id is 21551
Child: My parent is 1810
Child: I am exiting

如果我重新执行,有时输出结果是我期望的,有时则是意外的。


1
尝试在父进程中添加一些sleep();,我想你会得到你期望的结果。问题可能是以下内容https://en.wikipedia.org/wiki/Orphan_process。 - Valery Shevchuk
2个回答

3

找到了原因。那是很愚蠢的。父进程先结束,所以子进程(孤儿)被 init 进程收养了。

在我的情况下,它是进程ID为1810的 Upstart。

Upstart 是 /sbin/init 的基于事件的替代品。


1

事实上,不能保证调度程序会首先调度子进程。父进程可能在子进程运行之前终止。而且,在Linux中,每个进程都有一个父进程(除了交换进程),孤儿子进程将被分配给init。

您可以添加wait(),以便父进程等待子进程。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接