fork()输出

时间:2016-12-07 02:12:59

标签: c unix process fork

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

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

一个。 ACBC

湾bcac

℃。 ABCC

d。 BACC

即A或C或D(正确答案)

所以我想弄清楚为什么C是正确答案之一。以下是我的推理:

子流程先行,然后停止并将控制权传递给父流程(' a'打印出来)

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

父通行证 控制回孩子所以在子过程中(c打印出来)并且孩子被收获。

最后,回到父流程" c"打印。所以我们有abcc。

我是对的吗?

2 个答案:

答案 0 :(得分:1)

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

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

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

所以真正的情况将是:

  1. 将子字符'a'推入缓冲区,然后将'c'放入缓冲区。
  2. parent同时将字符'b'推入缓冲区并等待孩子。
  3. 子项退出并在此之前刷新包含"ac"的缓冲区。
  4. 父项从waitpid()返回,并将'c'推送到缓冲区。
  5. parent退出并刷新包含"bc"的缓冲区。
  6. 关于第二部分:

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

    waitpid是等待子进程直到它退出。它与杀戮过程无关,它只是等待(无论是由于它自己的退出还是由于被杀死,无论是哪个信号)。

答案 1 :(得分:0)

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

Parent    Child
          a
b
(waitpid)
          c
c