我读过,如果目录上未设置“执行”位,则无法将该目录设置为进程的工作目录。
但我不明白为什么会这样,我的意思是当您设置进程的工作目录时,您只是更改进程内存中的一个字符串。那么设置进程的工作目录与目录的“执行”位有什么关系呢?!
答案1
从 UNIX 内核的角度来看,更改工作目录需要调用chdir()
系统调用。
该系统调用在内核中执行权限检查,以查看进程是否具有该路径的执行权限。这只是 UNIX 的定义/规范。
如果没有权限,系统调用将返回错误。如果是,则更改该进程的当前工作目录。
该状态实际上表示为指向目录 inode 的指针,而不是简单的字符串。这就是为什么您可以重命名进程占用的目录。
注意:您实际上可以在不读取目录的情况下执行。 Read 允许您读取目录列表。仅当您知道目录名称时,才可以通过执行cd
进入目录并打开文件。
答案2
更改工作目录比仅仅更改进程内存中的字符串稍微复杂一些:它实际上保存在内核中并由系统调用更改。因此,当工作目录更改时,内核会进行访问控制检查。此外,如果x
未在目录上设置该位,则无论您的工作目录是什么,都无法访问该目录内的任何文件。
“执行”目录的概念并不像执行程序的概念那样真正存在,因此将其称为目录上的“执行”位有点误导。但是,它经常被称为其他名称,POSIX规范称之为“执行/搜索”权限,我见过它称为“访问”权限。 GNU 手册页也称其为“搜索”,例如chdir(2)
关于错误:
EACCES
路径组成部分之一的搜索权限被拒绝。
同样,您无法“执行”目录,也无法“搜索”或“访问”常规文件,因此在过去重复使用相同的位是可以理解的。