繁体   English   中英

fork()父级和子级输出过程

[英]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。 c

C。 密件抄送

d。 百家乐

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

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

子进程首先运行,然后停止并将控制权传递给父进程(“ a”打印输出)

然后由于waitpid(),父进程将执行(打印出“ b”),

父级将控制权传回给孩子,以便在子级处理(c打印输出)中获得子级。

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

我对吗?

从理论上讲,您的答案是正确的,它可能会像这样发生(因此,在最后(a),(c),(d)看来它们可能会发生)。

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

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

因此,实际情况将是:

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

关于第二部分:

SIGKILL可以终止任何进程(某些系统进程除外)。 子进程像其他进程一样是常规进程。

waitpid是等待子进程直到退出。 它与终止进程无关,它仅等待(无论是由于自身退出还是由于被终止,无论通过哪个信号)。

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

Parent    Child
          a
b
(waitpid)
          c
c

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM