奇怪的 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()
缓冲区被刷新,这发生在父级和所有子级中。
我正在尝试解决一个关于用一名员工(父进程)和多个客户(子进程)模拟商店的学校问题。我简化了下面的代码以突出我在测试时遇到的问题:
#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()
缓冲区被刷新,这发生在父级和所有子级中。