LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1561|回复: 6

关于文件描述符与文件指针

[复制链接]
发表于 2006-8-31 21:30:36 | 显示全部楼层 |阅读模式
首先是文件描述符和文件指针的区别?
我们知道,文件指针是指向一个FILE struct的,这个结构体里面有一个元素就是文件描述符。
然而,我在测试close和fclose时,发现,一旦文件描述符和文件指针一建立,不会因为调用close和fclose而消亡,它们依然存在,值也不会变的,当然已经无法使用了。

我现在的问题是:
既然FILE中包含文件描述符元素,是否可以用fopen()直接获取指针pf,然后使用pf->_file_descriptoe 表达式 取出文件描述符fd,这个fd是否和调用open()所获得的文件描述符一致??
因为fd是唯一的,我无法测试。
另外一个有趣的问题是:
我使用fputs()测试文件描述符(fd)和文件指针(fp)是否通用,发现并不能相互通用,但是有个奇怪的问题,我们知道putchar()吧 它实际上是fputc()函数的宏:
#define putchar(c) fputc(c,stdout)
其中,stdout是系统的标准输出文件描述符,值为1。
问题来了,既然stdout是文件描述符,此处fputc()的原型应该是fputc(char,FILE *)
可以看到,第2个参数应该是一个文件指针,但是在这里却可以使用文件描述符来代替。为什么我自己获得的文件描述符和文件指针却不能相互通用呢??

希望有达人,能帮助我去理解这个问题,谢谢了。

希望认识其他学习unix/linux,以及socket编程的朋友,我的联系方式:
QQ: 21354313  
email:  ivanlee1@163.com
发表于 2006-9-1 12:11:10 | 显示全部楼层
Post by 42899942

其中,stdout是系统的标准输出文件描述符,值为1。

谁告诉你的? 打印出来看看
回复 支持 反对

使用道具 举报

发表于 2006-9-1 12:14:11 | 显示全部楼层
btw: man fileno
回复 支持 反对

使用道具 举报

发表于 2006-9-1 12:53:16 | 显示全部楼层
stdout一样是一个FILE *
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-9-1 13:48:54 | 显示全部楼层
Post by rickxbx
谁告诉你的? 打印出来看看

这个说法的出处是《linux C编程》清华大学出版 作者李玉波
书中第6章 P133,
6.4
其中有一段: “在一个程序开始运行时,这些文件描述符中一般会有3个是已经为它打开的。它们是:标准输入,标准输出,标准出错……”
无法理解 希望可以指点迷津 谢谢
回复 支持 反对

使用道具 举报

发表于 2006-9-1 14:56:35 | 显示全部楼层
stdin 和 0 都是标准输入,一个是FILE * 一个是描述符吧
回复 支持 反对

使用道具 举报

发表于 2006-9-3 17:52:44 | 显示全部楼层
Post by 42899942
这个说法的出处是《linux C编程》清华大学出版 作者李玉波
书中第6章 P133,
6.4
其中有一段: “在一个程序开始运行时,这些文件描述符中一般会有3个是已经为它打开的。它们是:标准输入,标准输出,标准出错……”

这里说"标准输入,标准输出,标准出错" 指的应该是0,1,2三个描述符, 而并不是stdin,stdout,stderr,两者之间有关系(表示同一个流),但数值上不等
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表