红联Linux门户
Linux帮助

APUE上的fork程序的一个疑问,请教

发布时间:2008-07-17 22:44:06来源:红联作者:wpneu
第一次发帖请教一下:
这是APUE上的一段代码:

int global = 6;
char buf[] = "a write to stdout\n";

int main()
{
int var;
pid_t pid;

var = 88;
if(write(STDOUT_FILENO, buf, sizeof(buf)-1) != sizeof(buf)-1){
printf("write error\n");
exit(-1);
}
printf("before fork\n");

if((pid = fork()) < 0){
printf("fork error\n");
exit(-1);
}else if(pid == 0){
global++;
var++;
}else
sleep(2);
printf("pid = %d, global = %d, var = %d\n",getpid(), global, var);
exit(0);
}

当将其输出定向到一个文件执行时的结果如下:
$ 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

我的问题是关于为什么会有 2个 before fork输出? 书上的解释如下:

w r i t e函数是不带缓存的。因为在f o r k之前调用w r i t e,所以其数据写到标准输出一次。但是,标准 I / O库是带缓存的。回忆一下5 . 1 2节,如果标准输出连到终端设备,则它是行缓存的,否则它是全缓存的。当以交互方式运行该程序时,只得到p r i n t f输出的行一次,其原因是标准输出缓存由新行符刷新。但是当将标准输出重新定向到一个文件时,却得到p r i n t f输出行两次。其原因是,在f o r k之前调用了p r i n t f一次,但当调用f o r k时,该行数据仍在缓存中,然后在父进程数据空间复制到子进程中时,该缓存数据也被复制到子进程中。于是那时父、子进程各自有了带该行内容的缓存。在 e x i t之前的第二个p r i n t f将其数据添加到现存的缓存中。当每个进程终止时,其缓存中的内容被写到相应文件中。

我的疑惑在: ”于是那时父、子进程各自有了带该行内容的缓存“,既然父子进程都有带before fork的缓存,也就是子进程有 before fork 和
printf("pid = %d, global = %d, var = %d\n",getpid(), global, var); 内容,父进程也有before fork 和
printf("pid = %d, global = %d, var = %d\n",getpid(), global, var); 内容 那么在2个进程终止后,都将其输出到文件中,
那么结果应该是有三个 before fork 输出啊?


a write to stdout
before fork

before fork -------->我觉得这应该还有个子进程复制的内容吧? 疑问
pid = 432, glob = 7, var = 89
before fork
pid = 431, glob = 6, var = 88

请高手指点下,头一次发帖,请赐教,正在学习linux编程 ,希望大虾们指点一二,谢谢了
文章评论

共有 0 条评论