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。
我是对的吗?
答案 0 :(得分:1)
理论上,你的答案是正确的,它可能会发生这样的事情(所以最后(a),(c),(d)似乎可能发生这种情况。)
实际上,唯一正确的答案是(a)。
原因是stdio
使用内部缓冲区来缓存输出并避免昂贵的系统调用。因此,直到你的程序输出`\ n' (换行符)或退出,根本没有输出。
所以真正的情况将是:
'a'
推入缓冲区,然后将'c'
放入缓冲区。'b'
推入缓冲区并等待孩子。"ac"
的缓冲区。waitpid()
返回,并将'c'
推送到缓冲区。"bc"
的缓冲区。关于第二部分:
SIGKILL
可以杀死任何进程(除了某些系统进程)。子进程与其他进程一样是常规进程。
waitpid
是等待子进程直到它退出。它与杀戮过程无关,它只是等待(无论是由于它自己的退出还是由于被杀死,无论是哪个信号)。
答案 1 :(得分:0)
关于C如何发生的理由是正确的。时间(下降)看起来像这样:
Parent Child
a
b
(waitpid)
c
c