首先看一段代码:
#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会返回两次,父子进程都会执行fork后面的代码。
那么创建了多少个进程呢?如图:
每种颜色的‘-’代表着每个进程和其父进程所打印的,每种颜色处于下方的是当前进程打印的,上方的是父进程所打印的。可以看到,一共有4个进程。
又因为printf刷新缓冲区时不带’\n’时,是按全缓冲刷新的,即遇到文件结尾或缓冲区写满才会刷新,所以在fork时缓冲区作为一个进程PCB中的一部分也被子进程继承。
所以p4有缓冲区中有其父进程p1的一个“-”,p3缓冲区中有一个其父进程p2的一个“-”。所以p4打印“- -”,p3打印“- -”。加上一共就有8个。
而以下打印6个,因为\n刷新了缓冲区
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
int main(void)
{
int i;
for(i=0; i<2; i++){
fork();
printf("-\n");
}
return 0;
}