对目录的“执行”位感到困惑

对目录的“执行”位感到困惑

我读过,如果目录上未设置“执行”位,则无法将该目录设置为进程的工作目录。

但我不明白为什么会这样,我的意思是当您设置进程的工作目录时,您只是更改进程内存中的一个字符串。那么设置进程的工作目录与目录的“执行”位有什么关系呢?!

答案1

从 UNIX 内核的角度来看,更改工作目录需要调用chdir()系统调用。

该系统调用在内核中执行权限检查,以查看进程是否具有该路径的执行权限。这只是 UNIX 的定义/规范。

如果没有权限,系统调用将返回错误。如果是,则更改该进程的当前工作目录。

该状态实际上表示为指向目录 inode 的指针,而不是简单的字符串。这就是为什么您可以重命名进程占用的目录。

注意:您实际上可以在不读取目录的情况下执行。 Read 允许您读取目录列表。仅当您知道目录名称时,才可以通过执行cd进入目录并打开文件。

答案2

更改工作目录比仅仅更改进程内存中的字符串稍微复杂一些:它实际上保存在内核中并由系统调用更改。因此,当工作目录更改时,内核会进行访问控制检查。此外,如果x未在目录上设置该位,则无论您的工作目录是什么,都无法访问该目录内的任何文件。

“执行”目录的概念并不像执行程序的概念那样真正存在,因此将其称为目录上的“执行”位有点误导。但是,它经常被称为其他名称,POSIX规范称之为“执行/搜索”权限,我见过它称为“访问”权限。 GNU 手册页也称其为“搜索”,例如chdir(2)关于错误:

EACCES路径组成部分之一的搜索权限被拒绝。

同样,您无法“执行”目录,也无法“搜索”或“访问”常规文件,因此在过去重复使用相同的位是可以理解的。

相关内容