> Linux O_PATH文件描述符可以进行哪些操作? (只有*在函数?)
> O_PATH对非目录有用吗?
>文件描述符如何绑定到底层文件系统对象,如果它被移动,删除等会发生什么? O_PATH文件描述符是否计为一个引用,以防止在取消链接最后一个链接时释放该对象?等等.
解决方法
最近patch还有一个新的系统调用,fbind()
,它允许非常长的Unix域套接字名称.首先使用mknod(path,mode | S_IFSOCK,(dev_t)0)创建套接字文件,然后使用open(文件,O_PATH)打开.这样获得的文件描述符和Unix域套接字描述符被传递给fbind(),以将套接字绑定到路径名.这是否会包含在Linux内核中还有待观察 – 尽管即使它已经存在,但人们可以依赖它来普及它. (作为太长的Unix域套接字名称的解决方法,它可以更快地实现.)
我说O_PATH现在只对目录有用;文件使用可能会在将来找到.除了未来fbind()或类似的未来系统调用的可能性之外,我不知道对使用O_PATH打开的文件使用文件描述符.甚至fstatvfs()至少在3.5.0内核上也行不通.
在Linux中,只有在最后打开的文件描述符关闭时才会释放inode(文件内容和元数据).删除(取消链接)文件时,只删除与inode关联的文件名.因此,有两个独立的文件系统对象与文件描述符相关联:用于打开对象的名称和引用的底层索引节点.该名称仅用于路径解析,即调用open()(或等效)时.所有数据和元数据都在inode中.
使用O_PATH获得的文件描述符与普通文件描述符wrt一样(至少在内核3.5.0上).移动和重命名用于打开描述符的名称或名称组件. (描述符保持有效,因为它引用了inode,并且文件名对象仅在路径解析期间使用.保持描述符打开将保持分配inode资源,即使描述符已打开O_PATH.)