免费注册 查看新帖 |

Chinaunix

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

[C] dup获得的文件描述符经过fdopen转化为文件指针后会更改文件表项中的偏移量吗? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-08-11 08:47 |只看该作者 |倒序浏览
aa文件内容:
1111111111111111
2222222222222222
3333333333333333
4444444444444444
测试程序:
#include <unistd.h>
#include <stdio.h>
int main(){
        FILE *fp0,*fp1;
        char line[1024]="";
        int fd=0;

        fp0=fopen("aa","r");
        fgets(line,1024,fp0);
        fgets(line,1024,fp0);
        printf("%s",line);

        fd=dup(fileno(fp0));
        fp1=fdopen(fd,"r");
        fgets(line,1024,fp1);
        printf("%s",line);
}
运行结果:
2222222222222222
2222222222222222

为何会是这个结果?

论坛徽章:
0
2 [报告]
发表于 2009-08-11 08:54 |只看该作者
fgets(line,1024,fp1);
之前将line中内容清除看看。

论坛徽章:
0
3 [报告]
发表于 2009-08-11 11:30 |只看该作者

回复 #2 思一克 的帖子

memset清除掉后运行结果:
2222222222222222

就是说最后一次   fgets(line,1024,fp1)没有读到任何内容??为什么啊?

论坛徽章:
0
4 [报告]
发表于 2009-08-11 11:53 |只看该作者
在第二个fgets前加一行fseek(fp1, 0, SEEK_SET);试试看。

论坛徽章:
0
5 [报告]
发表于 2009-08-11 12:33 |只看该作者

回复 #4 yug1129 的帖子

加一行fseek(fp1, 0, SEEK_SET);后结果:
2222222222222222
1111111111111111
为什么不加读不出东西?、

论坛徽章:
0
6 [报告]
发表于 2009-08-11 12:52 |只看该作者
因为你读的文件比较小,被文件一次性读进内存了。所以文件指针指向了结尾。对于dup/dup2调用,跟open是不一样的。dup/dup2意味着这两个fd只是别名的关系,偏移的变动对两者同时有效。

论坛徽章:
0
7 [报告]
发表于 2009-08-11 13:06 |只看该作者
linjing@debian:~/code/dup$ ./a.out
2222
current pos: 10
current pos: 20

加了两行, 不知道为什么 offset 不一样
  fp1=fdopen(fd,"r");
  printf ("current pos: %d\n", ftell (fp0));
  printf ("current pos: %d\n", ftell (fp1));

论坛徽章:
0
8 [报告]
发表于 2009-08-11 13:07 |只看该作者
aa 的内容

linjing@debian:~/code/dup$ cat aa
1111
2222
3333
4444

论坛徽章:
0
9 [报告]
发表于 2009-08-11 13:34 |只看该作者
原帖由 pagx 于 2009-8-11 12:52 发表
因为你读的文件比较小,被文件一次性读进内存了。所以文件指针指向了结尾。对于dup/dup2调用,跟open是不一样的。dup/dup2意味着这两个fd只是别名的关系,偏移的变动对两者同时有效。


还是不太明白
我是一行一行读的,我读了两行,既然“偏移的变动对两者同时有效”,那第三次读的时候结果就应该是333333了啊?

论坛徽章:
0
10 [报告]
发表于 2009-08-11 17:35 |只看该作者
c语言的标准io是带缓冲的,所以你第一次读的时候,就已经读完了整个文件,文件的偏移由FILE结构中的成员记录。fileno后得到的文件描述符所关联的文件偏移已经到了末尾。你再打开它时FILE记录的文件偏由文件描述符的偏移设定,所以到了文件末尾。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP