8

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

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

1 回答 1

7

使用 获得的文件描述符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。)

于 2012-09-14T11:12:21.200 回答