#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<errno.h>
int main()
{
printf("abcd");
fork ();
printf("pqrs\n");
return 0;
}
该程序输出如下:
abcdpqrs
abcdpqrs
但怎么可能呢?不应该是:
abcdpqrs
pqrs
答案 0 :(得分:4)
否
这是因为fork还复制了printf中使用的数据结构,保存了要打印的缓冲区。
如果您分叉程序,则不刷新缓冲区。
答案 1 :(得分:3)
printf
不一定立即刷新stdout
,所以会发生“abcd”被缓冲直到执行下一个输出。因为后来fork的两个“side”都输出,所以两者都会清除“abcd”。
为了让它按照您猜测它的方式工作,请尝试手动刷新;
int main()
{
printf("abcd");
fflush(stdout);
fork ();
printf("pqrs\n");
return 0;
}
$ ./a.out
abcdpqrs
pqrs