1、一个fork()面试题
原题出自 陈皓 酷壳网 http://coolshell.cn/articles/7965.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int
main(
void
)
{
int
i;
for
(i=0; i<2; i++){
fork();
printf
(
"-"
);
}
return
0;
}
|
程序会输出8个 “ - ”;
原因:
(1)fork系统调用的特性:
----fork()系统调用时unix下以自身进程创建子进程的系统调用,一次调用,两次返回,如果返回0则是子进程,如果返回大于0则是父进程(实际上返回的是子进程的pid);
----在fork()调用处,整个父进程空间会原模原样的复制到子进程空间去,包括指令、变量值、程序调用栈、环境变量、缓冲区等
(2)printf(“-”)语句有buffer,所以printf会将“-”放入缓存中,并没有立即输出;printf如果是标准输出的话,即stdout,由于stdout是块设备,块设备一般都有缓冲区,那么输出的条件是:
-----遇到回车“\n"
----fflush语句
----缓冲区满
都没有遇到,则会先保存在缓冲区。
下面画图分析一下