考虑以下代码片段:
<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>
执行时,该程序令人惊讶地输出8 个点,而不是预期的 6 个。这怎么可能?
要理解意外的输出,我们必须深入研究 fork() 原语的复杂性。当调用 fork() 时,它会创建当前进程的近乎完美的副本。最显着的区别(对于大多数用途)是父进程和子进程的不同返回值。但是,提供的代码忽略了这些返回值,实际上使这种区别变得无关紧要。
最初,存在一个进程。随后,它创建第二个进程,导致两个进程打印一个点并继续循环。在第二次迭代中,每个进程再次创建一个副本,从而导致四个进程打印一个点然后退出。这解释了前六个点。
但是,printf() 使用输出缓冲。因此,这两个过程打印的初始点并不是立即可见的。这些点保持缓冲状态,并在 fork() 期间复制。只有当进程退出时,缓冲的点才会被刷新并出现。因此,四个进程输出一个缓冲点以及一个新点,会产生 8 个点的意外输出。
要抑制此行为,请使用 fflush(stdout);可以在每个 printf() 语句之后调用,从而确保点立即显示。
以上是为什么我的“fork()”循环产生的输出比预期多?的详细内容。更多信息请关注PHP中文网其他相关文章!