Chinaunix首页 | 论坛 | 博客
  • 博客访问: 607087
  • 博文数量: 353
  • 博客积分: 1104
  • 博客等级: 少尉
  • 技术积分: 1457
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-23 23:02
个人简介

1、刚工作时做Linux 流控;后来做安全操作系统;再后来做操作系统加固;现在做TCP 加速。唉!没离开过类Unix!!!但是水平有限。。

文章存档

2015年(80)

2013年(4)

2012年(90)

2011年(177)

2010年(1)

2009年(1)

分类:

2011-12-08 13:08:38

原文地址:fork进程后文件读写的问题 作者:CUDev

水木上的一个帖子,感觉还是需要注意的,就直接转过来了。

==============================================================
发信人: lihf05 (lihf05), 信区: KernelTech
标  题: 请教个fork进程后文件读写的问题
发信站: 水木社区 (Tue Aug 25 10:32:51 2009), 转信

程序如下:
int main()
{
FILE *fp;
int i=0;
unsigned char  c;
fp=fopen("./1.txt","r");
if(fork()==0)
{
        c=fgetc(fp);
        printf("child %c\n",c);
        fclose(fp);
        while(1);
}
else{
        sleep(1);
//      rewind(fp);
        c=fgetc(fp);
        printf("parent %c\n",c);
        while(1);
        }
return 0;
}
文件中的内容为"yes",输出结果为:
child y
parent

对于这种父子进程,会共享文件读写指针吗?为什么子进程只读了一个字符,父进程的读指
针就到了结尾了啊?有知道的人可以详细解释下或者推荐个链接吗?非常感谢

================================================================
发信人: luohandsome (天佑四川|为灾区人民祈祷), 信区: KernelTech
标  题: Re: 请教个fork进程后文件读写的问题
发信站: 水木社区 (Tue Aug 25 13:00:55 2009), 转信

1.man clone可以看到,对CLONE_FILES的解释。如果该标记位没有置上,那么系统调用只复
制文件描述符表(而不是file对象),所以文件的偏移量(保存在file对象中)仍然是共享的
。父进程lseek多少字节对子进程也是生效的。
fork()对应CLONE_FILES没有设置的情况,所以对应就是这种情况。
2.此外,从代码里也可以验证:
在copy_files中,有如下代码:
        for (i = open_files; i != 0; i--) {
                struct file *f = *old_fds++;
                if (f)
                        get_file(f);
                *new_fds++ = f;
        }
这段代码只是对file对象增加引用计数,并不复制。而这段代码无论有没有设置
CLONE_FILES标记都会执行。

========================================================
发信人: lihf05 (lihf05), 信区: KernelTech
标  题: Re: 请教个fork进程后文件读写的问题
发信站: 水木社区 (Tue Aug 25 14:56:53 2009), 转信

谢谢你的回帖,这样我的输出应该是:
child y
parent e
子进程只读了一个字符,读指针到了字符'e'位置,那么父进程应该从'e'位置处读起,而结
果却是到了文件结尾处。总觉得这个程序输出比较诡异,很难解释。

============================================================
发信人: luohandsome (天佑四川|为灾区人民祈祷), 信区: KernelTech
标  题: Re: 请教个fork进程后文件读写的问题
发信站: 水木社区 (Tue Aug 25 15:23:14 2009), 转信

fread在read之上又做了一层缓冲。所以fread一个字节,执行到read可能一次读1024个字节
甚至更多。对read来说,文件指针已经到末尾了。
你可以试一下直接用read,那么输出与你的预期是一致的

阅读(497) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~