为什么 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() 调用创建了四个进程:原始进程和三个子进程。每个进程在创建时都会打印一个点,占前六个点。
缓冲输出
但是,还有一个问题。 printf() 使用缓冲区来存储输出,直到它被刷新或进程退出。在此代码中,直到进程退出后才会刷新输出。
因此,在第二次分叉期间,原始进程和第一个子进程中的点仍保留在缓冲区中。当剩余的四个进程(两个来自第一个分支,两个来自第二个分支)退出时,它们会刷新缓冲区,从而打印点。这使得总输出达到 8 个点。
防止缓冲输出
要避免这种行为,您可以调用 fflush(stdout);在每次 printf() 调用之后强制立即刷新输出。但是,这在某些情况下可能会影响性能。
以上是为什么这段代码中 `fork()` 产生的点比预期多?的详细内容。更多信息请关注PHP中文网其他相关文章!