奇怪的fork()行为(先前的printf被调用)

cab*_*nto 2 c printf fork

我正在尝试解决一个学校模拟问题,该问题涉及模拟具有一个员工(父流程)和多个客户(子流程)的商店。我简化了以下代码以突出测试时遇到的问题:

#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);
}
Run Code Online (Sandbox Code Playgroud)

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

工作工作工作工作工作工作工作工作工作工作工作工作

我希望printf只能由父进程执行一次,但是,似乎为每个子进程创建了打印件。

我在这里想念什么?

Rus*_*lan 5

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