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>
令人惊讶的是,当这个程序执行时,它输出了 8 个点,而不是预期的 6 个点。这种差异最初看起来令人费解。
剖析代码的执行
要理解这种行为,我们必须逐步分解执行过程:
缓冲输出
问题的症结在于 printf() 的缓冲输出。当进程打印时,输出不会立即刷新到屏幕上。相反,它存储在缓冲区中。此行为很重要,因为 fork() 系统调用会复制缓冲区,从而导致重复的缓冲点。
总共 8 个点
当四个进程终止时,它们的缓冲点被刷新,将它们添加到最初打印的单个点中。这将导致总共输出 8 个点。
避免问题
为了防止这种行为,可以在之后使用 fflush(stdout) 显式刷新输出缓冲区每次 printf() 调用。这确保了输出立即发送到屏幕,消除了进程数和打印点数之间的差异。
以上是为什么这段代码中 `fork()` 输出 8 点而不是 6 点?的详细内容。更多信息请关注PHP中文网其他相关文章!