#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
int main(void)
{
int i;
for(i=0; i<2; i++){
fork();
printf("-");
}
return 0;
}
本人思路:
答:三个
因为是先fork,再printf,所以第一次fork创建的子进程的缓冲区中没有“-”,此时缓冲区中只有一个“-”,第二次进入创建再次进行fork,此时父进程的缓冲区中有一个“-”,fork之后,进行printf,第二个子进程中就有了一个”-“,此时父进程有两个,第二个子进程有一个,共三个。程序结束时,进程全部退出,刷新缓冲区,输出三个”-“。
实际测试:
原因:
错误分析:
* 不了解fork之后父子进程都会执行fork后面的代码,然后没有考虑到printf缓冲区的情况 *
如图:
第一次父进程进入之后fork子进程子1,同事要记得父子进程都会执行fork之后的代码,所以此时父子都会printf“-”,此时是两个“-”
然后第二次fork,父进程再创建一个子进程子2,同时两个都打印printf“-”,
子1进程fork孙子进程孙1,此时子1和孙1都打印“-”,此时共6个“-”;
这也是理论情况下的,但是由于printf有自己的缓冲区,所以会多打印两个,即8个。,因为printf刷新缓冲区时不带’\n’时,是按全缓冲刷新的,即遇到文件结尾或缓冲区写满才会刷新,所以在fork时缓冲区作为一个进程PCB中的一部分也被子进程继承。
- 步骤:
父创建子1,父和子1都打印“-“——2
此时printf自己的缓冲区中有两个
父进程再次创建子2,此时父进程的printf缓冲空间中有一个“-”,fork时被子2继承,所以子2的printf缓冲区中本来就有一个“-”,再加上自己打印的,共有两个,同理,子1fork孙1时,孙1继承子1的,也继承一个“-”,再打印一个,此时也多一个,共多两个。