fork() 中意外分支的奇怪案例
考虑以下使用 fork() 原语创建子进程的代码片段:
<code class="C">#include <stdio.h> #include <sys/types.h> #include <unistd.h> int main(void) { int i; for(i = 0; i < 2; i++) { fork(); printf("."); } return 0; }</code>
令人惊讶的是,执行此程序会产生八个输出点,比您最初预期的多六个。为什么会出现这种情况?
揭开隐藏进程
为了解开这个谜团,让我们深入研究 fork() 的操作。 fork() 创建当前进程的副本,从而产生父进程和子进程。
最初,有一个进程,它分叉为两个进程。这两个过程都增量执行 for 循环,每次打印一个点。在第二次迭代中,每个进程再次分叉,总共创建四个进程。这四个进程在终止前打印一个点。
缓冲输出和延迟出现
但是,printf() 缓冲其输出,这意味着它会在发送之前累积多个打印内容立刻。当所有四个进程打印第二个点时,它们会被缓冲。这就是偷偷摸摸的效果出现的地方。
在 fork() 上,缓冲的点由子进程继承。因此,当每个子进程退出时,其缓冲点出现在输出流上。将这四个延迟点添加到增量打印的四个点中,总共会达到意想不到的八个点。
避免缓冲点
要绕过此缓冲行为,建议调用fflush(标准输出);在每个 printf() 语句之后。这会强制立即发送输出,确保显示预期的点数。
以上是为什么简单的 fork() 循环产生八个点而不是两个?的详细内容。更多信息请关注PHP中文网其他相关文章!