免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: flyingbxf
打印 上一主题 下一主题

关于dup2()的疑问. [复制链接]

论坛徽章:
0
41 [报告]
发表于 2004-02-21 23:05 |只看该作者

关于dup2()的疑问.

[quote]原帖由 "forest077"]我有一个不解的地方,就是freopen实现的功能也是把一个流重定向到另一个流去,它和dup、dup2的底层实现有什么不一样吗?[/quote 发表:


freopen 并不是把一个流定向到另一个流,而是把一个流对应到一个新的文件:

fd1 = dup (fd);   fd1, fd 对应同一个文件, 但不能指定 fd1 的值。

dup2 (fd, fd1);  fd1, fd 对应同一个文件,但可以指定 fd1的值,根据 kj501提供的资料, fd1 不能大于 1024

freopen ("xxx", "w", fp);  关掉 fp 对应的文件, 并打开文件 xxx, 指针 fp 的值不变。

在前两种情况中, 都有两个文件描述符出现, 但在第三种情况中, 只有一个文件指针。

使用 freopen (..., fp) 时, 原来 fp 对应的缓存写入, 关掉 fileno(fp), 寻找一个最小未用的文件描述符, 在其上打开新文件。也就是说, fp 值不变, 其指向的 FILE 结构仍然使用, 但 fileno (fp) 则有可能改变。

论坛徽章:
0
42 [报告]
发表于 2004-02-21 23:42 |只看该作者

关于dup2()的疑问.

原帖由 "win_hate" 发表:


呵呵, 确实如此。 事实上,文件指针,比如说fp, 是根据fileno(fp)来对应文件的。你看上面的代码,STDOUT_FILENO 已经对应到 install.log,所以,当fflush(stdout)后, 缓冲内容写入文件 install.log。如果不fflus..........

可以理解为 dup2首先close标准输出,然后把标准输出的文件描述符STDOUT_FILENO 传到fd所代表的fp文件指针结构中

STDOUT_FILENO 指向install.log的文件表

文件指针stdout的文件描述符为STDOUT_FILENO

所以fflush(stdout)后, 缓冲内容写入文件 install.log

论坛徽章:
0
43 [报告]
发表于 2004-02-22 08:48 |只看该作者

关于dup2()的疑问.

原帖由 "Wangwen" 发表:

可以理解为 dup2首先close标准输出,然后把标准输出的文件描述符STDOUT_FILENO 传到fd所代表的fp文件指针结构中

STDOUT_FILENO 指向install.log的文件表

文件指针stdout的文件描述符为STDOUT_FILENO

所以f..........


说法有误,dup2 是低级 I/O 操作函数, 不会直接与 fp 指向的文件结构打交道。

论坛徽章:
0
44 [报告]
发表于 2004-02-23 09:24 |只看该作者

关于dup2()的疑问.

原帖由 "converse" 发表:

fflush(stream)刷新的是流stream上的缓冲,是不是可以理解为不论文件描述符STDOUT_FILENO定位到了哪个文件,stdout都保存有未写入文件的缓冲区的内容呢?........

不用fflush(stream)就写不进文件,但为什么不用fflush(stream)就能输出到屏幕上呢?

论坛徽章:
0
45 [报告]
发表于 2004-02-23 09:29 |只看该作者

关于dup2()的疑问.

还有就是  dup2(STDOUT_FILENO,sfd); 和
dup2(sfd,STDOUT_FILENO); 起的作用是一样的?都是将两个文件描述符指向同一个文件是吗?

论坛徽章:
0
46 [报告]
发表于 2004-02-23 12:08 |只看该作者

关于dup2()的疑问.

可以理解为 dup2首先close标准输出,

将STDOUT_FILENO 指向install.log的文件表

文件指针stdout的文件描述符为STDOUT_FILENO

所以fflush(stdout)后, 缓冲内容写入文件 install.log

使用fprintf(fp,"hello\n";fflush(fp);仍然可以将hello写入install.log

dup2(id, STDOUT_FILENO)使STDOUT_FILENO指向标准输出

printf("world\n";写入终端

论坛徽章:
0
47 [报告]
发表于 2004-02-23 12:11 |只看该作者

关于dup2()的疑问.

原帖由 "flyingbxf" 发表:

不用fflush(stream)就写不进文件,但为什么不用fflush(stream)就能输出到屏幕上呢?

程序结束是 执行了fflush(stream)

论坛徽章:
0
48 [报告]
发表于 2004-02-23 14:14 |只看该作者

关于dup2()的疑问.

原帖由 "Wangwen" 发表:
可以理解为 dup2首先close标准输出,

将STDOUT_FILENO 指向install.log的文件表

文件指针stdout的文件描述符为STDOUT_FILENO

所以fflush(stdout)后, 缓冲内容写入文件 install.log

使用fprintf(fp,"hello\n";fflush(fp);仍然可以将hello写入install.log

dup2(id, STDOUT_FILENO)使STDOUT_FILENO指向标准输出

printf("world\n";写入终端


Great!

论坛徽章:
0
49 [报告]
发表于 2004-02-23 14:25 |只看该作者

关于dup2()的疑问.

xiexie

论坛徽章:
0
50 [报告]
发表于 2004-02-23 20:10 |只看该作者

关于dup2()的疑问.

茅塞顿开,不错不错,强烈建议加精
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP