免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1844 | 回复: 2
打印 上一主题 下一主题

apue之fork缓存问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-10-05 16:05 |只看该作者 |倒序浏览
看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将其数据添加到现存的缓存中。当进程终止时,其缓存中内容被写入到相应文件中。(不重定向不是也进行数据空间的复制吗?该缓存就不复制、输出了?标准输出和重定向到文件有什么不同??)
看了这段文字好几遍,没看明白。请大侠帮忙,不胜感激!!

论坛徽章:
0
2 [报告]
发表于 2009-10-05 16:55 |只看该作者
据我所知,
》问题1:为什么子进程只执行fork后面的代码,不是说正文段共享吗?也就是说为什么不执行两次write系统调用
因为fork返回后从fork后面的语句开始执行,不是从头再执行一次。
》问题2:为什么不重定向就只写一次before fork,重定向就写两次?
这是因为标准IO函数的缓存特性,看到第5章标准I/O库就明白了。
》问题3:新行符是什么,“\n”?,"\r"?
同上,看到第5章就明白了。

printf输出到标准输出,而标准输出是行缓存的(另外,标准输入也是行缓存,标准出错不缓存),所以遇到'\n'就刷新,而文件是全缓存的,默认应该是BUFSIZ,定义在stdio.h

论坛徽章:
0
3 [报告]
发表于 2009-10-07 15:42 |只看该作者

回复 #2 LaveWang 的帖子

谢谢,有点明白了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP