- 论坛徽章:
- 0
|
看apue时关于fork后子进程缓存的疑问,书上原文如下:
[code]
#include <sys/types.h>
#include "ourhdr.h"
int glob=6;//external variable in initialized data
char buf[]="a write to stdout\n";
int main()
{
int var;//automatic variable on the stack
pid_t pid;
var = 88;
if (write(STDOUT_FIFLNO,buf,sizeof(buf)-1)!=sizeof(buf)-1)
err_sys("write error");
printf("before fork\n");//we don`t flush stdout
if(pid=fork()<0)
err_sys("fork error");
else if(pid==0) // child
{
glob++; //modify variable
var++;
}
else
sleep(2);//parent
printf("pid = %d,glob = %d,var = %d\n",getpid(),glob,var);
exit (0);
}
[code]
程序运行结果:
$ a . o u t
a write to stdout
before fork
pid = 430, glob = 7, var = 89 子进程的变量值改变了
pid = 429, glob = 6, var = 88 父进程的变量值没有改变
$ a.out > temp.out
$ cat temp.out
a write to stdout
before fork
pid = 432, glob = 7, var = 89
before fork
pid = 431, glob = 6, var = 88
问题1:为什么子进程只执行fork后面的代码,不是说正文段共享吗?也就是说为什么不执行两次write系统调用
问题2:为什么不重定向就只写一次before fork,重定向就写两次?
原文说:当以交互式运行改程序(不重定向)时,只得到printf输出行一次,原因是标准输出缓存由新行符刷新(问题3:新行符是什么,“\n”?,"\r"?烦劳指出程序中那部分进行了刷新,重定向就不刷新了?)
但是将标准输出重定向到一个文件时,得到printf两次。其原因是fork之前调用了一次printf,当调用fork时,该行数据仍在缓存中,然后在父进程数据空间复制到子进程时,该缓存数据也被复制到子进程中。在exit之前的第二个printf将其数据添加到现存的缓存中。当进程终止时,其缓存中内容被写入到相应文件中。(不重定向不是也进行数据空间的复制吗?该缓存就不复制、输出了?标准输出和重定向到文件有什么不同??)
看了这段文字好几遍,没看明白。请大侠帮忙,不胜感激!! |
|