【问题标题】:Semantics of Linux O_PATH file descriptors?Linux O_PATH 文件描述符的语义?
【发布时间】:2012-09-14 01:10:14
【问题描述】:

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

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

【问题讨论】:

  • 我曾希望将 O_PATH 文件描述符用于通过 cap_get_fdcap_set_fd 管理的功能。但这不起作用,我收到了一个错误的文件描述符错误。太糟糕了。
  • @MvG:您是否尝试过在您打开的O_PATH 文件描述符的/proc/self/fd/ 条目上使用cap_get_filecap_set_file?这似乎是所有内核无法让您直接使用O_PATH文件描述符的解决方法,并且proc条目永久与inode挂钩(即使它不是真正的符号链接它在目录列表中显示为一个)所以这种方法是无种族的,就像直接使用 fd 一样。
  • @R:由于在我的实际应用中,我有读取权限,所以我只是打开文件进行读取。但感谢您提供的信息。

标签: c linux posix


【解决方案1】:

使用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 打开的文件有任何用途。至少在 3.5.0 内核上,即使 fstatvfs() 也不起作用。

在 Linux 中,inode(文件内容和元数据)仅在最后一个打开的文件描述符关闭时才被释放。删除(取消链接)文件时,您只删除与 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,即使您没有文件的读取权限。
  • @R.. 对;接得好。我也不记得检查您是否可以获得此类描述符的文件租约。如果可以,那将是另一种用途。 (我认为您的 sn-p 中有错字:应该是 execl(buf, "my_prog", (char *)0);。)
猜你喜欢
  • 1970-01-01
  • 2011-04-10
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 2012-10-09
  • 1970-01-01
  • 2012-11-12
  • 2010-10-02
相关资源
最近更新 更多