pid_t pid;
printf("hello ");
pid=fork();
printf("world ");
执行结果是打印了两行 hello world
问题出现在 printf ,它是有数据缓冲区的,不加 \n 数据不刷新
fork()创建子进程时,复制了父进程的数据段和堆栈段,包括上面所讲的缓冲区,在执行后面的 printf ,就打印了两遍hello world.
pid_t pid;
printf("hello \n");
//fflush(stdout);
pid=fork();
printf("world ");
这段代码的执行结果是
hello
hello world
如果加上 \n 后,换行符会刷新缓冲区,将 hello 输出,printf 数据缓冲区被洗,fork()执行完,打印两次 world 就结束了。fflush(stdout) 和 \n 效果相同。
这是为什么呢? 这是由【设备的不同缓冲属性】决定的。我们现实运行结果的设备是标准输出设备,而【标准输出设备在正常情况下是linux中的行缓存的设备(除出错)】,’\n’正是换行符,所以会换行时清空缓存。而linux中写入文件流是全缓存的,也就是换行符并不会冲洗缓冲区
printf("pid=%d",getpid());
fork();
这段代码两次打印的都是父进程的 pid