Ubuntu

每次呼叫 fork() 時將 printf() 循環輸出到 stdout,儘管 printf() 在 fork() 之前呼叫。為什麼 ’n’ 解決了這個問題?

  • April 28, 2020

當我在玩耍時,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 的每個分支。

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