Linux 什么是 File descriptor?

clc3123 · 2011年11月24日 · 最后由 clc3123 回复于 2012年02月04日 · 10075 次阅读

近期实验 eventmachine,迷迷糊糊试图了解其中的一些实现原理。 反复提及一个 linux 下的 file descriptor 这个概念,听起来像是一个文件的属性? 可是 socket 也有 file descriptor? 哪位能给解释下,通俗点最好,暂时没有时间去啃 linux,多谢

就是打开文件的句柄, 类似于 winapi 下的 handler ,unix 系统下 socket 和文件处理方式是很类似的,所以也是用文件描述符的 参考 : http://zh.wikipedia.org/wiki/%E6%96%87%E4%BB%B6%E6%8F%8F%E8%BF%B0%E7%AC%A6

#1 楼 @aNdReW_Qx 谢谢你给的连接。 是不是说网络连接,文件操作等等,都跟 fd 有关?操作后都会引起 fd 的变化,还是生成一个新的 fd?编程基础不好,说的不准确还请原谅

#2 楼 @clc3123 相当于一个资源的引用, 你 open 一个 file , 如果成功,就获得一个 fd,以后你就利用这个 fd 可以对文件或者 socket 进行写入或者读取操作 (具体取决于你打开文件的模式) , 完成以后你需要对这个 fd 进行 close 操作, 这样才会解锁文件并清空读写缓存

打开文件或者 socket 之后给你一个 fd,然后你可以拿着 fd 去操作文件或者 socket,也可以把这个 fd 做为参数传来传去。你不能把文件或者 socket“本身” 作为一个参数传给一个函数吧,传 fd 就可以,因为它就是一个类似指针的东西。函数里面就根据这个 fd 对这同一个文件或者已经建立的 socket 连接进行操作。 之所以 socket 和文件都有 fd 的原因是都可以在上面做打开,关闭,读,写等等操作

#3 楼 @aNdReW_Qx #4 楼 @cqpx oic! 还有个问题是,fd 是不是具有某种状态,而这种状态能够被查询到? 比如说:有个 eventmachine 的样例程序,就是在 terminal 下运行后,可以跟踪我的键盘输入。那么我猜想相关的 fd 应该具有某种状态是吗?要不然我 stdin 输入了一些东西,em 的 event loop 怎么能知道发生了什么,是这样吗?

#5 楼 @clc3123 应该不会..fd 只是一个数据结构,没有事件, 你要监事文件系统的状态需要用其他的 gem,

比如 mac 下的 rb-fsevent ,linux 下是 rb-inotify

需要 登录 后方可回复, 如果你还没有账号请 注册新账号