Linux 2.6.39引入了O_PATH
开放模式,(大体上说)根本不打开文件(即不创build打开的文件描述),而是给出一个文件描述符来处理未打开的目标。 它的主要用途是作为函数的参数( openat
等),它似乎适用于Linux以前缺less的POSIX 2008 O_SEARCH
function的实现。 但是,我一直无法find有关O_PATH
的确切语义的任何良好的文档。 我有几个具体的问题是:
O_PATH
文件描述符有哪些可能的操作? (只有*at
function?) O_PATH
对非目录有用吗? O_PATH
文件描述符是否作为引用来防止最后一个链接被解除链接时释放对象? 等等。 使用open(directory, O_PATH | O_DIRECTORY)
获得的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
获得的O_PATH
(至少在内核3.5.0)的行为,就像正常的文件描述符wrt。 移动并重命名用于打开描述符的名称或名称组件。 (描述符保持有效,因为它指向inode,文件名对象仅在路径解析过程中使用。保持描述符打开将保持inode资源分配,即使描述符打开了O_PATH
。)