【问题标题】:fork() Parent and child Processes of outputfork() 父子进程的输出
【发布时间】:2016-12-07 02:12:59
【问题描述】:
void main(){
  if(fork()==0)
    printf("a");
  else{
   printf("b");
   waitpid(-1,NULL,0);
}     
   printf("c");
   exit(0); 
}

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

一个。国歌

b. bcac

c。 abcc

d。巴克

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

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

子进程先走后停止,把控制权交给父进程,('a'打印出来)

然后父进程因为waitpid()而执行(“b”打印出来),

父母通行证 在子进程(c 打印输出)中将控制权返回给子进程,然后子进程被收割。

最后,回到父进程“c”打印出来。所以我们有 abcc。

我说的对吗?

【问题讨论】:

  • 也许我不知道我在说什么,但你确定 C 是正确的吗?好像应该是E。
  • E 是正确答案。

标签: c unix process fork


【解决方案1】:

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

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

原因是stdio 使用内部缓冲区来缓存输出并避免昂贵的系统调用。因此,在您的程序输出 `\n'(换行符)或退出之前,根本不会有任何输出。

所以真正的场景是:

  1. 将字符'a' 推入缓冲区,然后将'c' 推入缓冲区。
  2. 父级同时将字符'b' 推入缓冲区并等待子级。
  3. 在此之前子级退出并刷新包含"ac" 的缓冲区。
  4. 父级从waitpid()返回并将'c'推入缓冲区。
  5. 父级退出并刷新包含"bc" 的缓冲区。

关于第二部分:

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

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

【讨论】:

    【解决方案2】:

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

    Parent    Child
              a
    b
    (waitpid)
              c
    c
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-04
      • 1970-01-01
      • 1970-01-01
      • 2014-12-06
      • 1970-01-01
      • 1970-01-01
      • 2012-01-14
      相关资源
      最近更新 更多