fork() Parent 和 child 输出过程

fork() Parent and child Processes of output

void main(){
  if(fork()==0)
    printf("a");
  else{
   printf("b");
   waitpid(-1,NULL,0);
}     
   printf("c");
   exit(0); 
}

问题:程序的输出是什么?

一个。美国广播公司

b。 bcac

c。美国广播公司

d。 bacc

e。 A 或 C 或 D(正确答案)

所以我想弄清楚为什么 C 是正确的 answer.The 以下是我的推理:

child进程先走后停,将控制权交给parent进程,('a'打印出来)

然后 parent 进程执行("b" 打印出来)因为 waitpid(),

parent 通过 控制权回到 child 所以在 child 过程中(c 打印出来)并且 child 被收割。

最后,回到parent过程"c"打印出来。所以我们有 abcc.

我说得对吗?

理论上,你的答案是正确的,它可能会像这样发生(所以在最后(a),(c),(d)似乎它们可能会发生)。

实际上,唯一正确的答案是 (a)。

原因是 stdio 使用内部缓冲区来缓存输出并避免昂贵的系统调用。因此,直到你的程序输出‘\n’(换行符)或退出,根本就没有输出。

所以真实的场景是:

  1. child 将字符 'a' 推入缓冲区,然后将 'c' 推入缓冲区。
  2. parent 同时将字符 'b' 推入缓冲区并等待 child.
  3. child 退出并刷新之前包含 "ac" 的缓冲区。
  4. parent returns 来自 waitpid() 并将 'c' 推入缓冲区。
  5. parent 退出并刷新包含 "bc".
  6. 的缓冲区

关于第二部分:

SIGKILL 可以杀死任何进程(除了一些系统进程)。 Child 流程与其他流程一样是常规流程。

waitpid就是等待child进程退出。它与杀死进程无关,它只是等待(无论是由于自己退出还是由于被杀死,无论是通过哪个信号)。

你关于 C 是如何发生的推理是正确的。时间(下降)看起来像这样:

Parent    Child
          a
b
(waitpid)
          c
c