C
為什麼帶有 fork() 的程序有時會多次列印其輸出?
在程序 1
Hello 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)。