time 
设为首页】【收藏本站
当前位置: 主页 > Unix/Linux > Linux管理 > Linux维护 > fork进程后文件读写的问题

fork进程后文件读写的问题

时间:2009-11-27 00:00 点击:800次 字体:[ ]




水木上的一个帖子,感觉还是需要注意的,就直接转过来了。
==============================================================
发信人: 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,那么输出与你的预期是一致的
               
               
               



本文地址 : http://www.fengfly.com/plus/view-164010-1.html
标签: 文件 进程 问题 水木 发信 fork fp
------分隔线----------------------------
最新评论 查看所有评论
发表评论 查看所有评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
验证码: