Linux 2.6.39引入了O_PATH
开放模式,(粗略地说)根本没有真正打开文件(即不创建一个打开的文件描述),但只提供了一个文件描述符处理未开启的目标。它的主要用途是作为*at
函数(openat
等)的参数,它似乎适合作为Linux以前缺少的POSIX 2008 O_SEARCH
功能的实现。但是,我一直无法找到关于O_PATH
的确切语义的任何好文档。我有几个具体问题:
O_PATH
文件描述符可以执行哪些操作? (只有*at
个函数?)O_PATH
对非目录有用吗?O_PATH
文件描述符是否计为引用,以防止在取消链接最后一个链接时释放对象?等答案 0 :(得分:6)
使用open(directory, O_PATH | O_DIRECTORY)
获取的文件描述符不仅对...at()
函数有用,而且对fchdir()
有用(因为内核版本为3.2.23,我相信)。
新的系统调用patch最近还有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
获取的文件描述符与正常文件描述符wrt一样(至少在内核3.5.0上)。移动和重命名用于打开描述符的名称或名称组件。 (描述符保持有效,因为它引用了inode,并且文件名对象仅在路径解析期间使用。保持描述符打开将保持分配的inode资源,即使描述符已打开O_PATH
。)< / p>