[英]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'(换行符)或退出之前,根本没有输出。
因此,实际情况将是:
'a'
推入缓冲区,然后将'c'
推入缓冲区。 'b'
压入缓冲区并等待子级。 "ac"
缓冲区。 waitpid()
返回并将'c'
压入缓冲区。 "bc"
缓冲区。 关于第二部分:
SIGKILL
可以终止任何进程(某些系统进程除外)。 子进程像其他进程一样是常规进程。
waitpid
是等待子进程直到退出。 它与终止进程无关,它仅等待(无论是由于自身退出还是由于被终止,无论通过哪个信号)。
您关于C如何发生的推理是正确的。 时间(下来)看起来像这样:
Parent Child
a
b
(waitpid)
c
c
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.