为什么Linux下没有用于打开功能的O_SEARCH标志?

时间:2017-05-24 13:07:48

标签: linux unix

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

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?

由于

3 个答案:

答案 0 :(得分:3)

事实证明,Linux并没有支持这个标志,正如W. Richard Stevens Stephen A. Rago的书" UNIX环境中的高级编程"您可以在这里查看Link to the book on google books

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

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

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

如果我错了,请纠正我!

答案 1 :(得分:0)

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

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

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

  

为什么呢?如何才能获得仅具有搜索权限的目录的fd?

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

答案 2 :(得分:0)

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

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