Ubuntu
每次呼叫 fork() 時將 printf() 循環輸出到 stdout,儘管 printf() 在 fork() 之前呼叫。為什麼 ’n’ 解決了這個問題?
當我在玩耍時,
fork()
我注意到一個相當奇怪的行為,但我自己不知道為什麼會發生這種情況。在下面的範例中,每次呼叫之前
fork()
呼叫的輸出printf()
都會列印到標準輸出。輸出中的值test
表明它printf()
並沒有真正再次執行,否則test
每次都會增加。
\n
更奇怪的是——或者可能是解決方案的關鍵——當我添加到 printf() 格式字元串的末尾時,這種行為不會發生。有人知道為什麼會這樣嗎?也許它與標準輸出緩衝區有關?我對這些東西不是很熟悉。
還是我做錯了什麼?
#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/wait.h> #include <unistd.h> int main(char* args) { pid_t pid; int wstatus; int test = 0; printf("\n[%d] parent start | test = %d ", getpid(), test++); // This works fine //printf("\n[%d] parent start | test = %d \n", getpid(), test++); for(int i = 0; i < 5; i++) { if((pid = fork()) == 0) { //printf("\n[%d] Child spawned ", getpid()); exit(0); } //printf("\n[%d] Printing with fork() commented out works fine", getpid()); } while(wait(&wstatus) > 0); printf("\n[%d] parent end\n\n", getpid()); return 0; }
輸出:
[342470] parent start | test = 0 [342470] parent start | test = 0 [342470] parent start | test = 0 [342470] parent start | test = 0 [342470] parent start | test = 0 [342470] parent start | test = 0 [342470] parent end
萬一有什麼用
$ uname -a Linux Aspire 5.4.0-26-generic #30-Ubuntu SMP Mon Apr 20 16:58:30 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
printf
已將文本寫入stdout緩衝區,最終通過exit
呼叫將其寫入 fork 的每個分支。