Linux O_PATH文件描述符的语义?

R..*_*R.. 6 c linux posix

Linux 2.6.39引入了O_PATH开放模式,(粗略地说)根本没有真正打开文件(即不创建开放文件描述),而只是提供了一个文件描述符,它是未打开目标的句柄.它的主要用途是作为*at函数(openat等)的参数,它似乎适合作为O_SEARCHLinux以前缺少的POSIX 2008 功能的实现.但是,我一直无法找到关于其确切语义的任何好文档O_PATH.我有几个具体问题:

  1. Linux O_PATH文件描述符可以进行哪些操作?(只有*at功能?)
  2. O_PATH与非目录永远有用吗?
  3. 如何将文件描述符绑定到底层文件系统对象,以及如果它被移动,删除等会发生什么?O_PATH文件描述符是否计为一个引用,以防止在取消链接最后一个链接时释放该对象?等等.

Nom*_*mal 6

使用的文件描述符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关联的文件名.因此,有两个独立的文件系统对象与文件描述符相关联:用于打开对象的名称和引用的底层索引节点.该名称仅用于路径解析,即open()调用何时(或等效).所有数据和元数据都在inode中.

使用O_PATH行为(至少在内核3.5.0上)获得的文件描述符就像普通文件描述符wrt一样.移动和重命名用于打开描述符的名称或名称组件.(描述符保持有效,因为它引用了inode,并且文件名对象仅在路径解析期间使用.保持描述符打开将保持分配的inode资源,即使描述符已打开O_PATH.)

  • 您错过的文件用途之一是 `O_PATH` 可以提供 `O_EXEC`,即 `fd=open("my_prog", O_PATH); snprintf(buf, sizeof buf, "/proc/self/fd/%d", fd); 即使您没有文件的读取权限,execl(fd, "my_prog", (char *)0);` 也可以执行 `my_prog` 。 (2认同)