【问题标题】:fork() and parent/child process idsfork() 和父/子进程ID
【发布时间】:2017-02-10 03:41:02
【问题描述】:

我有点困惑为什么以下两个程序中的子进程显示不同的父 ID。

第一个程序:

 int main ( void ) {
   int pid, fpid, ppid;
   fpid = fork ();
   pid = getpid();
   ppid = getppid();
   printf ("fpid is %d\n", fpid);
   sleep(5);
   if (fpid > 0){
       printf ("\nThis is Parent. My pid %d. My parent's pid %d\n",pid,ppid);
   }
   else if (fpid ==0){
       sleep(1);
       printf ("\nThis is Child. My pid %d. My parent's pid %d\n",pid,ppid);
   }
   else
       printf ("fork failed\n");
   return (0);
}

输出:

fpid is 53560
fpid is 0

This is Parent. My pid 53559. My parent's pid 44632

MacBook-Pro:~/Desktop/$ 

This is Child. My pid 53560. My parent's pid 53559

第二个程序:

int main ( void ) {
   int pid, fpid, ppid;
   fpid = fork ();
   printf ("fpid is is %d\n", fpid);
   sleep(5);
   if (fpid > 0){
       pid = getpid();
       ppid = getppid();
       printf ("\nThis is Parent. My pid %d. My parent's pid %d\n",pid,ppid);
   }
   else if (fpid ==0){
       sleep(1);
       pid = getpid();
       ppid = getppid();
       printf ("\nThis is Child. My pid %d. My parent's pid %d\n",pid,ppid);
   }
   else
       printf ("fork failed\n");
   return (0);
}

输出:

fpid is is 53635
fpid is is 0

This is Parent. My pid 53634. My parent's pid 44632

MacBook-Pro:~/Desktop$ 

This is Child. My pid 53635. My parent's pid 1

我了解进程 1 是在原始父进程终止后接管父进程的进程。我想我想知道的是:在这两种情况下,父进程是否在子进程可以处理其printf 之前完成?输出不应该一样吗?

【问题讨论】:

  • 您在第二个程序中的孩子中有一个sleep(1)。因此,当您执行getppid() 时,父级将终止。这就是你得到 1 的原因。第一个程序是在睡觉前获取 ppid,这就是你得到正确值的原因。
  • 在您的第一个示例中,您会立即获得 ppid,因此父级尚未退出。
  • 一般来说,当父进程创建子进程时(例如通过调用fork(),父进程应该在子进程退出之前始终不退出。这通常由父进程调用wait() 来完成或waitpid()
  • 进程 id 1 是(在 linux 中)init() 函数,它从一开始就运行,直到系统关闭或重新启动。在现代系统中,当子进程的父进程在子进程之前退出时,init() 进程会获取子进程。但是,一般来说,当父进程先退出时,子进程就变成了zombie进程,这意味着它不能被杀死、删除等,除非重新启动计算机。

标签: c linux fork child-process


【解决方案1】:

由于父进程和子进程同时运行,因此执行顺序取决于运行时。其中一个可以提前完成。当父进程在子进程到达其getppid() 之前完成时,子进程将被init 采用。因此父 ID 为 1。
要查看子进程的实际父进程 ID:

  1. 使用wait()waitpid()
  2. 让父级等待其子级终止
  3. 让父母在“这是父母”printf() 之后睡一些可感知的时间,例如 sleep(120)

【讨论】:

    【解决方案2】:

    在这两种情况下,父进程不是在子进程可以处理它的 printf 之前完成吗?

    很可能是这样,但不是绝对肯定。您无法确保通过sleep()ing 持续任何时间。

    输出不应该一样吗?

    它们可能相同,但不太可能相同。重要的是要注意在每个程序中何时调用 getppid()。报告的父进程 ID 是调用时应用的那个;以后打印值时不一定仍然适用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-06
      • 1970-01-01
      • 1970-01-01
      • 2013-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多