fork()和父/子进程ID

时间:2017-02-10 03:41:02

标签: c linux fork child-process

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

第一个程序:

 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之前父进程是否已完成?不应该输出相同吗?

2 个答案:

答案 0 :(得分:3)

由于父进程和子进程并发运行,执行顺序取决于运行时。其中一个可以提前完成。如果父级在子级到达getppid()之前完成,则子进程将由init采用。因此父母身份1.
要查看孩子的实际父进程ID:

  1. 让父母使用wait()waitpid()
  2. 等待其子女终止
  3. 让父母在{'这是父母' sleep(120)

答案 1 :(得分:1)

  

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

非常可能如此,但并非绝对肯定。你不能<{>}确保 CGFloat(2)任何时间。

  

输出不应该相同吗?

他们可以相同,但他们不太可能。重要的是要注意每个程序self.startingPoint的调用时间。报告的父进程ID是在呼叫时应用的进程ID;当值打印时,它不一定适用于以后。