奇怪的 fork() 行为(以前的 printf 被召回)

Strange fork() behavior (previous printf is recalled)

我正在尝试解决一个关于用一名员工(父进程)和多个客户(子进程)模拟商店的学校问题。我简化了下面的代码以突出我在测试时遇到的问题:

#define N_CUSTOMERS 10

void employee() {
}

void customer(int id) {
    exit(0);
}

int main() {

    printf("working!");

    // create customers
    for(int i = 0; i < N_CUSTOMERS; i++)
        if(!fork())
            customer(i);

    // be employee
    employee();

    // end
    exit(0);
}

输出是(使用gcc -Wall -pthread store.c -o store编译):

working!working!working!working!working!working!working!working!working!working!

我希望 printf 仅由父进程执行一次,但是,似乎每个创建的子进程都有一个打印。

我在这里错过了什么?

printf 使用行缓冲输出。由于打印的字符串没有'\n',所以在fork()之前没有打印。在 exit() 缓冲区被刷新,这发生在父级和所有子级中。