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>
执行后,该程序输出的不是人们想象的 6 个点,而是令人惊讶的 8 个点。这怎么可能?
深入 fork() 深渊
答案就在 fork() 的复杂工作原理中。该函数本质上创建了当前进程的近乎完美的副本,包括其内存和打开的文件描述符。主要区别在于返回值,父进程和子进程之间的返回值不同。
在我们的示例中,初始进程通过第一个 fork() 创建第二个进程。然后,这两个进程都会打印一个点,然后再次循环和分叉。在第二个fork()之后,有四个进程,每个进程在退出前打印一个点。因此,我们可以解释六个点。
但是,随着 printf() 的隐藏性质,情节变得更加复杂。默认情况下, printf() 缓冲其输出,延迟其实际显示。因此,在第一次 fork() 调用之前打印的第一个点仍然不可见。这个隐藏的点,加上第二个 fork() 之后来自父进程和三个子进程的四个缓冲点,导致最终计数为 8 个点。
避免缓冲迷宫
为了避免这种行为并确保 printf() 立即输出,可以在每次 printf() 调用后使用 fflush(stdout) 函数。这会强制写入缓冲输出,防止点消失在阴影中。
以上是为什么这个 C 程序在使用 fork() 时打印 8 点而不是 6 点?的详细内容。更多信息请关注PHP中文网其他相关文章!