使用 获得的文件描述符open(directory, O_PATH | O_DIRECTORY)
不仅对...at()
函数有用,而且对fchdir()
(我相信从内核版本 3.2.23 开始)有用。
最近还有一个新的系统调用补丁fbind()
,它允许非常长的 Unix 域套接字名称。套接字文件首先使用 创建mknod(path, mode | S_IFSOCK, (dev_t)0)
,然后使用open(file, O_PATH)
. 如此获得的文件描述符和一个 Unix 域套接字描述符被传递给fbind()
,以将套接字绑定到路径名。这是否会被包含在 Linux 内核中还有待观察——尽管即使是这样,人们也需要数年时间才能依赖它被普遍使用。(不过,作为过长的 Unix 域套接字名称的一种解决方法,它会更早可行。)
我想说O_PATH
的是现在只对目录有用;将来可能会发现文件用途。除了未来的可能性fbind()
或类似的未来系统调用之外,我不知道文件描述符对使用O_PATH
. fstatvfs()
至少在 3.5.0 内核上, 甚至都行不通。
在 Linux 中,inode(文件内容和元数据)仅在最后一个打开的文件描述符关闭时才被释放。删除(取消链接)文件时,您只删除与 inode 关联的文件名。因此,有两个独立的文件系统对象与文件描述符相关联:用于打开对象的名称和引用的底层 inode。该名称仅用于路径解析,即何时open()
(或等效)被调用。所有数据和元数据都在 inode 中。
使用行为获得的文件描述符O_PATH
(至少在内核 3.5.0 上)就像普通文件描述符 wrt。移动和重命名用于打开描述符的名称或名称组件。(描述符保持有效,因为它引用 inode,并且文件名对象仅在路径解析期间使用。保持描述符打开将保持分配的 inode 资源,即使描述符已打开O_PATH
。)