假设我需要获取仅具有执行(或搜索)权限的文件(或目录)的文件描述符。
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?
由于
答案 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中使用它。
如果要查找目录,请使用opendir
,readdir
和用于目录管理的系统调用。
为什么呢?如何才能获得仅具有搜索权限的目录的fd?
我不知道这是否有帮助,但您可以打开只读并查找所需的文件,然后以fopen
以只读模式打开该文件。
答案 2 :(得分:0)
在Linux上,您可以使用O_PATH
获取仅具有搜索权限的目录的fd。在其他POSIX系统上,可以将一个进程和chdir
派生到目录;每当您要相对于该目录执行openat
时,都可以让进程为您执行open
并将fd发送到您的主进程(AF_UNIX
和SCM_RIGHTS
是可移植的方式)。
在访问之前从目录中撤消搜索许可的情况下,两者均严格不等于O_SEARCH
。 POSIX保证对于使用O_SEARCH
打开的fd不会进行进一步的权限检查,但是O_PATH
和chdir
都会检查每次访问。