尽管 printf() 在 fork() 之前调用,但每次调用 fork() 时都会将 printf() 循环输出到 stdout。为什么 '\n' 可以解决这个问题?

尽管 printf() 在 fork() 之前调用,但每次调用 fork() 时都会将 printf() 循环输出到 stdout。为什么 '\n' 可以解决这个问题?

当我玩的时候,fork()我注意到一种相当奇怪的行为,但我无法弄清楚为什么会发生这种情况。

在下面的示例中,每次调用之前调用fork()的输出printf()都会打印到 stdout。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

答案1

已将printf文本写入标准输出buffer,最终通过调用写入到 fork 的每个分支中exit

相关内容