gpt4 book ai didi

c - 需要知道 fork 是如何工作的吗?

转载 作者:太空狗 更新时间:2023-10-29 17:14:09 24 4
gpt4 key购买 nike

我正在尝试以下 C 代码:

int main()
{
printf("text1\n");
fork();
printf("text2\n");
return 0;
}

我期待得到两个“text1”和两个“text2”的输出,例如:

text1
text1
text2
text2

但是,我却得到了:

text1
text2
text2

只有一个“text1”???好的,如果子进程从 fork() 执行,那么为什么我得到两个“text1”:

int main()  
{
printf("text1");
fork();
printf("text2\n");
return 0;
}

现在的输出是:

text1text2  
text1text2

如果子进程在fork之后启动,输出应该是:

text1  
text2
text2

最佳答案

fork() 通过将当前进程中的所有内容复制到新进程中来创建一个新进程。这通常包括内存中的所有内容和 CPU 寄存器的当前值以及一些小的调整。因此,实际上,新进程也获得了进程指令指针的副本,因此它会在原始进程继续的同一点恢复(fork() 之后的指令)。


为了处理您的更新,printf() 被缓冲。通常缓冲区在末尾遇到换行符 '\n' 时会被刷新。但是,由于您省略了这一点,因此缓冲区的内容会保留并且不会被刷新。最后,两个进程(原始进程和子进程)都将拥有包含 "text1" 的输出缓冲区。当它最终被刷新时,您会在两个进程中看到这一点。

在实践中,您应该始终在 fork 之前刷新文件和所有缓冲区(包括 stdout)以确保不会发生这种情况。

printf("text1");
fflush(stdout);
fork();

输出应该如下所示(按某种顺序):

text1text2text2

关于c - 需要知道 fork 是如何工作的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6011635/

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