一、首先看一个程序:
#include <stdio.h>
#include <sys/wait.h>
#include <unistd.h>
Int main()
{
Int i = 0;
For(i = 0 ; i < 2 ; i++)
{
Fork();
Printf(“-”);
}
Wait(NULL);
Wait(NULL);
Return 0;
}
上面这个程序一共输出多少个“-”?
相信对fork()函数有所了解的,可能会说出是6个,但是结果真的是这样的吗?其实不然,正确的输出是8个。为什么会是这样呢?下面我们就来揭晓:
其实很简单,不知道有人注意没,上面的程序的printf语句中没有换行。首先,我们都知道,fork时,子进程会复制父进程的进程空间,包括指令,变量值,程序调用栈,环境变量,缓冲区等。上面那个程序之所以输出8个是因为printf语句有缓存,该语句将“-”放入了缓存中,而没有真正输出,所以fork时,子进程会复制父进程的缓冲区,就多出了两个“-”。
用图来表示可能更清楚些。

本文通过一个程序实例解析frok与vfork的区别,指出因printf缓存导致的输出差异,并解释了为什么vfork后的子进程调用return会结束整个程序,而exit则不会。文章还探讨了vfork在内存共享和exec上的优化作用,以及fork的写时拷贝(COW)优化策略。
最低0.47元/天 解锁文章
3936

被折叠的 条评论
为什么被折叠?



