【问题标题】:Why is there no O_SEARCH flag under Linux for open function?为什么Linux下没有O_SEARCH标志用于打开功能?
【发布时间】:2017-05-24 13:07:48
【问题描述】:

假设我需要获取只有执行(或搜索)权限的文件(或目录)的文件描述符。

X/Open 规范为 open() 函数定义了一个 O_SEARCH 标志。见http://pubs.opengroup.org/onlinepubs/9699919799/functions/open.html

但是,Linux 没有。只有 3 个可用标志(O_RDONLY、O_WRONLY 和 O_RDWR)。见http://man7.org/linux/man-pages/man2/open.2.html

为什么?以及如何获取只有搜索权限的目录的fd?

谢谢

【问题讨论】:

  • 好问题。只是打开一个目录来阅读有问题吗?

标签: linux unix


【解决方案1】:

事实证明,Linux 还不支持这个标志,正如 W. Richard Stevens Stephen A. Rago 的书“UNIX 环境中的高级编程”中所述,您可以在此处查看 Link to the book on google books

实际上,该标志是在 POSIX 中定义的,在标准 C 库中实现(在本例中是 glibc,这就是为什么你在 man 3 open 下找到它的原因)但在 Linux 内核中没有实现(因此在 man 2 open 下找不到)。

编辑 1: 由于我们在 Linux 下使用 GNU,它包含特定的 Linux 头文件,以便能够进行 Linux 可行的适当系统调用(在这种情况下,它包括 fcntl-linux.h 和 fcntl.h)。

编辑 2:错误票 https://sourceware.org/bugzilla/show_bug.cgi?id=18228

如果我错了,请纠正我!

【讨论】:

  • Glibc 甚至根本没有定义宏。
  • 这让我非常激动。 Glibc 声称它符合 POSIX.1,尽管 POSIX.1 明确定义了 O_SEARCH 标志而 glibc 没有...
【解决方案2】:

在 Linux 上,您可以使用 O_PATH 获取仅具有搜索权限的目录的 fd。在其他 POSIX 系统上,你可以 fork 一个进程和chdir 到目录;每当您想相对于该目录执行openat 时,您可以让进程为您执行open 并将fd 发送到您的主进程(AF_UNIX 和SCM_RIGHTS 是一种可移植的方式)。

在访问之前从目录中撤销搜索权限的情况下,两者都不严格等同于O_SEARCH。 POSIX 保证不会对使用 O_SEARCH 打开的 fd 进行进一步的权限检查,但 O_PATH 和 chdir 都会检查每次访问。

【讨论】:

    【解决方案3】:

    如果您查看 open(3)(它在手册页中看起来像 3P,link),您应该会看到该标志。我使用的是 2017-05-24 更新的 ArchLinux。

    编辑 1:我编辑帖子以放置 link to the screenshot,以便您可以看到图像,尽管我无法在 C 中使用它。

    如果要查找目录,请使用opendir、readdir 和用于目录管理的系统调用。


    为什么?以及如何获取只有搜索权限的目录的fd?

    我不知道这是否有帮助,但您可以以只读方式打开并查找您需要的文件,然后以只读模式使用fopen 打开该文件。

    【讨论】:

    • 感谢您的回答。您链接的页面是否符合 POSIX 规范。我正在使用的 linux(Ubuntu 16.04)似乎没有 O_SEARCH 标志。你确定 ArchLinux 有这个标志吗?
    • 是的,我做了一个man 3 open,它向我展示了这一点。我链接的页面是 kernel.org (see it) 的手册页项目。转到“3:库函数”并查找open(3p)。
    • 就是这样。该标志可用于 C 库函数,但不用于系统函数。无论如何,谢谢你的帮助!
    猜你喜欢
    • 2011-12-04
    • 2010-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-21
    • 1970-01-01
    相关资源
    最近更新 更多