Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5695334
  • 博文数量: 675
  • 博客积分: 20301
  • 博客等级: 上将
  • 技术积分: 7671
  • 用 户 组: 普通用户
  • 注册时间: 2005-12-31 16:15
文章分类

全部博文(675)

文章存档

2012年(1)

2011年(20)

2010年(14)

2009年(63)

2008年(118)

2007年(141)

2006年(318)

分类: LINUX

2009-08-25 19:00:10

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

==============================================================
发信人: 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,那么输出与你的预期是一致的

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

chinaunix网友2009-09-10 02:21:38

注意:子进程会复制父进程从fork后的代码执行之!!so..很这个问题要克服!

chinaunix网友2009-09-10 02:21:38

注意:子进程会复制父进程从fork后的代码执行之!!so..很这个问题要克服!

chinaunix网友2009-08-27 18:05:38

*_________*

chinaunix网友2009-08-27 18:05:38

*_________*