fork() Parent 和 child 输出过程
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。 bcac
c。美国广播公司
d。 bacc
e。 A 或 C 或 D(正确答案)
所以我想弄清楚为什么 C 是正确的 answer.The 以下是我的推理:
child进程先走后停,将控制权交给parent进程,('a'打印出来)
然后 parent 进程执行("b" 打印出来)因为 waitpid(),
parent 通过
控制权回到 child 所以在 child 过程中(c 打印出来)并且 child 被收割。
最后,回到parent过程"c"打印出来。所以我们有 abcc.
我说得对吗?
理论上,你的答案是正确的,它可能会像这样发生(所以在最后(a),(c),(d)似乎它们可能会发生)。
实际上,唯一正确的答案是 (a)。
原因是 stdio
使用内部缓冲区来缓存输出并避免昂贵的系统调用。因此,直到你的程序输出‘\n’(换行符)或退出,根本就没有输出。
所以真实的场景是:
- child 将字符
'a'
推入缓冲区,然后将 'c'
推入缓冲区。
- parent 同时将字符
'b'
推入缓冲区并等待 child.
- child 退出并刷新之前包含
"ac"
的缓冲区。
- parent returns 来自
waitpid()
并将 'c'
推入缓冲区。
- parent 退出并刷新包含
"bc"
. 的缓冲区
关于第二部分:
SIGKILL
可以杀死任何进程(除了一些系统进程)。 Child 流程与其他流程一样是常规流程。
waitpid
就是等待child进程退出。它与杀死进程无关,它只是等待(无论是由于自己退出还是由于被杀死,无论是通过哪个信号)。
你关于 C 是如何发生的推理是正确的。时间(下降)看起来像这样:
Parent Child
a
b
(waitpid)
c
c
void main(){
if(fork()==0)
printf("a");
else{
printf("b");
waitpid(-1,NULL,0);
}
printf("c");
exit(0);
}
问题:程序的输出是什么?
一个。美国广播公司
b。 bcac
c。美国广播公司
d。 bacc
e。 A 或 C 或 D(正确答案)
所以我想弄清楚为什么 C 是正确的 answer.The 以下是我的推理:
child进程先走后停,将控制权交给parent进程,('a'打印出来)
然后 parent 进程执行("b" 打印出来)因为 waitpid(),
parent 通过 控制权回到 child 所以在 child 过程中(c 打印出来)并且 child 被收割。
最后,回到parent过程"c"打印出来。所以我们有 abcc.
我说得对吗?
理论上,你的答案是正确的,它可能会像这样发生(所以在最后(a),(c),(d)似乎它们可能会发生)。
实际上,唯一正确的答案是 (a)。
原因是 stdio
使用内部缓冲区来缓存输出并避免昂贵的系统调用。因此,直到你的程序输出‘\n’(换行符)或退出,根本就没有输出。
所以真实的场景是:
- child 将字符
'a'
推入缓冲区,然后将'c'
推入缓冲区。 - parent 同时将字符
'b'
推入缓冲区并等待 child. - child 退出并刷新之前包含
"ac"
的缓冲区。 - parent returns 来自
waitpid()
并将'c'
推入缓冲区。 - parent 退出并刷新包含
"bc"
. 的缓冲区
关于第二部分:
SIGKILL
可以杀死任何进程(除了一些系统进程)。 Child 流程与其他流程一样是常规流程。
waitpid
就是等待child进程退出。它与杀死进程无关,它只是等待(无论是由于自己退出还是由于被杀死,无论是通过哪个信号)。
你关于 C 是如何发生的推理是正确的。时间(下降)看起来像这样:
Parent Child
a
b
(waitpid)
c
c