我的理解是,一个文件描述符是一个整数,是内核每进程映射到open()
ed 文件、管道、套接字等对象的关键。
“打开文件/套接字/管道/...”(文件描述符的指称)是否有一个正确、简短且具体的名称?
将它们称为“文件”会导致与文件系统中存储的未打开文件混淆。简单地引用文件描述符并不能充分描述语义(例如复制整数进程之间是没有用的)。
咨询The Open Group 基本规格我自己的系统的联机帮助页使我得出这样的结论:文件描述符的指示对象是目的当它是一个特定的打开文件时,它是一个打开文件。有没有比这个更具体的术语目的?
答案1
实际上没有更具体的术语。在传统的 Unix 中,文件描述符引用文件表,其中的条目称为文件,或者有时打开文件。这是在特定的上下文中,所以虽然显然这个术语文件是非常通用的,在上下文中文件表它特指打开的文件。
磁盘上的文件通常称为索引节点,尽管从技术上讲,索引节点是文件的元数据部分。然而,由于索引节点和数据块之间的关系是一对一的,因此引用索引节点隐式地引用它所指向的数据。更现代的文件系统可能支持诸如可共享数据块的写时复制等功能,因此这并不普遍适用,但适用于传统的 Unix。然而,鉴于术语文件系统,考虑到其内容是一个不小的飞跃文件。
inode 也被读入内存核心索引节点当磁盘上的文件被打开并保存在索引节点表,但这是比您所要求的更进一步的间接级别。
这导致了术语上的冲突:磁盘上的文件(由索引节点引用)和打开的文件(由文件表中的条目引用)。
我建议“打开文件”或“文件表条目”都足以描述您想要描述的内容。
我发现的一份相当简洁的参考资料位于:http://www.hicom.net/~shchuang/Unix/unix4.html。表格的参考文献(巴赫恩)是本书的参考文献Unix操作系统的设计作者:莫里斯·J·巴赫。
答案2
在第七版 Unix 中,文件描述符是用户结构中表的索引,该表只是指向[系统全局]打开文件表的指针数组。所以文件描述符本身实际上是一个间接引用,某种“指向指针的指针”。它还索引一个单字节标志字段数组(至少在当时仅包括 close-on-exec 标志)。
struct user {
...
struct file *u_ofile[NOFILE]; /* pointers to file structures of open files */
char u_pofile[NOFILE]; /* per-process flags of open files */
}
打开文件表本身包含打开文件的读/写模式、指向 inode 的指针、位置以及现代系统上可能的许多其他内容。我不知道现代系统上的文件描述符表是否包含比这更多的内容。
看: