(1)在分析这个问题之前,先得熟悉一下缓冲区以及标准I/O中printf相关的问题。 printf行缓冲的概念以及刷新缓冲区的条件
(2)关于fork,在本例分析中只需要记住一点,fork之后子进程的地址空间中是拷贝了父进程的缓冲区的。
例1:
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <assert.h>
int main() {
for (int i=0; i<2; ++i) {
fork();
printf("A\n"); //注意此处有\n, 直接刷新到标准输出中
}
return 0;
}
执行结果:
由执行结果,上述例1共输出六个A。下面我们来分析一下:
由上图能够很直观看到为什么会输出六个A。
例2:
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <assert.h>
int main() {
for (int i=0; i<2; ++i) {
fork();
printf("A"); \\注意此处未加换行符
}
return 0;
}
执行结果:
看执行结果,相对于增加换行符的printf多输出了两个A,这是为什么?
文章的开头已经提及,fork出来的子进程会拷贝父进程的缓冲区。只要能把握住这一点,就能分析出原因来。