fork函数实例代码:
交互式执行此程序:
$ ./a.out
a write to stdout
before fork
pid = 430, glob = 7, var = 89
pid = 429, glob = 6, var = 88
标准输出定位到文件执行此程序:
$ ./a.out >temp.out
a write to stdout
before fork
pid = 432, glob = 7, var = 89
before fork
pid = 431, glob = 6, var = 88
这里before fork输出了两次。
解释如下:
write函数是不带缓冲的,所以在fork之前调用write,数据写到标准输出一次,只显示一次。
标准I/O是带缓冲的,标准输出连接到终端设备是行缓冲的,否则是全缓冲的。
当以交互方式运行时,只得到printf输出地行一次,此时是行缓冲,缓冲区内容遇到换行符时被冲洗。
当将标准输出定位到一个文件时,得到了两次输出,原因是。在fork之前调用了一次printf,由于是全缓冲,
调用fork时改行数据仍在缓冲区内,然后在将父进程的数据空间复制到子进程中时,该缓冲区也被复制到子进程中。于是父进程子进程都有了该行内容的标准I/O缓冲区,在exit钱的第二个printf将其数据添加到现有缓冲区,当每个进程结束时,最终冲洗缓冲区中的副本