水木上的一个帖子,感觉还是需要注意的,就直接转过来了。
==============================================================
发信人: 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) |