fork() 中意外分支的奇怪案例
考虑以下使用 fork() 原语创建子进程的代码片段:
#include
#include
#include
int main(void)
{
int i;
for(i = 0; i 令人惊讶的是,执行该程序会产生八个输出点,比您最初预期的多六个。为什么会出现这种情况?
揭开隐藏进程
为了解开这个谜团,让我们深入研究一下 fork() 的操作。 fork() 创建当前进程的副本,从而产生父进程和子进程。
最初,有一个进程,它分叉为两个进程。这两个进程都增量执行 for 循环,每次打印一个点。在第二次迭代中,每个进程再次分叉,总共创建四个进程。这四个进程在终止前打印一个点。
缓冲输出和延迟出现
但是,printf()缓冲其输出,这意味着它在发送之前会累积多个打印内容立刻。当所有四个进程打印第二个点时,它们会被缓冲。这就是偷偷摸摸的效果出现的地方。
在 fork() 上,缓冲的点由子进程继承。因此,当每个子进程退出时,其缓冲点出现在输出流上。将这四个延迟点添加到增量打印的四个点中,总共会达到意想不到的八个点。
避免缓冲点
要绕过此缓冲行为,建议调用fflush(标准输出);在每个 printf() 语句之后。这会强制立即发送输出,确保显示预期的点数。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3