C

為什麼帶有 fork() 的程序有時會多次列印其輸出?

  • February 17, 2019

在程序 1Hello world中只列印一次,但是當我刪除 \n並執行它(程序 2)時,輸出會列印 8 次。有人可以解釋一下\n這裡的意義以及它如何影響fork()嗎?

程序 1

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int main()
{
   printf("hello world...\n");
   fork();
   fork();
   fork();
}

輸出 1:

hello world... 

節目二

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int main()
{
   printf("hello world...");
   fork();
   fork();
   fork();
}

輸出 2:

hello world... hello world...hello world...hello world...hello world...hello world...hello world...hello world...

當使用 C 庫的printf()函式輸出到標準輸出時,輸出通常是緩衝的。fflush(stdout)在您輸出換行符、呼叫或退出程序(雖然不是通過呼叫)之前,緩衝區不會被刷新_exit()。預設情況下,標準輸出流在連接到 TTY 時以這種方式進行行緩衝。

當您在“程序 2”中 fork 程序時,子程序會繼承父程序的每個部分,包括未刷新的輸出緩衝區。這有效地將未刷新的緩衝區復製到每個子程序。

當程序終止時,緩衝區被刷新。您總共啟動了八個程序(包括原始程序),並且未刷新的緩衝區將在每個單獨的程序終止時被刷新。

它是8 個,因為在每個fork()過程中,您獲得的程序數量是之前的兩倍fork()(因為它們是無條件的),並且您擁有其中的三個(2 3 = 8)。

引用自:https://unix.stackexchange.com/questions/447898