为什么Linux的open函数中没有O_SEARCH标志?

6
假设我需要获取仅具有执行(或搜索)权限的文件(或目录)的文件描述符。
X/Open norm为open()函数定义了O_SEARCH标志。参见此处 然而,Linux没有这个标志。只有三种可用的标志(O_RDONLY,O_WRONLY和O_RDWR)。请参阅此处 为什么?如何获取仅具有搜索权限的目录的fd?
谢谢

好问题。只打开一个目录进行读取是否存在问题? - jiveturkey
3个回答

3
事实证明,正如W. Richard Stevens Stephen A. Rago所述,“UNIX环境高级编程”一书中所指出的,Linux尚不支持此标志,您可以在此处查看该书 Google图书链接
实际上,该标志在POSIX中定义,在标准C库中实现(在这种情况下是glibc,因此您可以在man 3 open中找到它),但未在Linux内核中实现(因此在man 2 open中找不到)。
编辑1: 由于我们在Linux下使用GNU,因此它包括特定的头文件以便Linux能够进行适当的系统调用(在本例中,它还包括fcntl-linux.h)。
编辑2:错误票据 https://sourceware.org/bugzilla/show_bug.cgi?id=18228 如果我有错误,请纠正我!

Glibc根本没有定义这个宏。 - Petr Skocik
2
这让我非常不爽。Glibc声称它符合POSIX.1标准,尽管POSIX.1明确定义了O_SEARCH标志,但glibc却没有... - El Mostafa IDRASSI

1
在Linux上,您可以使用O_PATH获取仅具有搜索权限的目录的fd。在其他POSIX系统上,您可以fork一个进程并chdir到该目录;每当您想要相对于该目录执行openat时,您可以让进程为您执行open并将fd发送到主进程(AF_UNIXSCM_RIGHTS是这样做的一种便携式方法)。
在从目录中撤消搜索权限之前,两者都不严格等同于O_SEARCH。 POSIX保证使用O_SEARCH打开的fd不会进行进一步的权限检查,但是O_PATHchdir将在每次访问时进行检查。

0

如果你查看open(3)(在man页面中看起来像3P,链接),你应该能看到那个标志。我使用的是更新于2017-05-24的ArchLinux。

编辑1:我编辑了帖子,加入了一个截图链接,这样你就可以看到图片了,尽管我不能在C中使用它。

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


为什么?我如何只使用搜索权限获取目录的fd?
我不知道这是否有帮助,但您可以以只读方式打开并查找所需的文件,然后以只读模式使用fopen打开该文件。

谢谢你的回答。你提供的页面是POSIX标准的。我使用的Linux(Ubuntu 16.04)似乎没有O_SEARCH标志。你确定ArchLinux有这个标志吗? - El Mostafa IDRASSI
1
是的,我执行了 man 3 open 命令并查看了相关信息。我提供的链接是来自 kernel.org 的 man 手册项目(点击此处)。请前往“3:库函数”并查找 open(3p) - user3696685
没错,这就是问题所在。对于C库函数,该标志是可用的,但对于系统函数则不存在。无论如何,感谢您的帮助! - El Mostafa IDRASSI

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接