gpt4 book ai didi

c - fork() 父子进程的输出

转载 作者:行者123 更新时间:2023-11-30 15:02:32 28 4
gpt4 key购买 nike

void main(){
if(fork()==0)
printf("a");
else{
printf("b");
waitpid(-1,NULL,0);
}
printf("c");
exit(0);
}
<小时/>

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

a.

b. BCAC

c. ABCC

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. parent 从 waitpid() 返回并将 'c' 插入缓冲区。
  5. 父进程退出并刷新包含“bc”的缓冲区。

关于第二部分:

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

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

关于c - fork() 父子进程的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41008302/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com