我正在查看运行的ls -l
结果/proc/<pid>/fd/
:
lr-x------ 1 root root 64 Apr 22 23:13 0 -> /dev/null
lrwx------ 1 root root 64 Apr 22 23:13 1 -> 'socket:[19700]'
lrwx------ 1 root root 64 Apr 22 23:13 2 -> 'socket:[19700]'
...
符号链接上的权限是什么意思?我首先想到的是它们代表了文件描述符的“模式”。但是,如果确实如此,那为什么stdout
可读?此外,为什么所有描述符都是可执行的?
人 chmod(1) 说:
它们基本上没有任何意义。
Linux 的
/proc
文件系统将实际上不是文件的对象呈现为文件:它使用已知的 API 将对象呈现为文件。对于文件描述符,不存在实际的符号链接。但是符号链接是一种显示文件描述符信息的便捷方式。这样的符号链接是在需要时动态创建的(并且可能会缓存在 VFS 中,因此它们通常会有第一次显示的日期)。通常在 Linux 上,符号链接总是拥有所有可能的允许权限,因为它是它们的目标,而是经过验证的。但是在这里,权限被呈现以反映文件描述符的打开方式。它们显示为由用户拥有(或者有时是 root,例如,当进程设置为不可转储或不可跟踪时)并且仅限于用户访问属性,即使没有真正检查访问属性(强制执行所有权检查,见下文)。许多细节记录在
proc(5)
/proc/[pid]/fd/
例如在入口处:所以人们只能检查属于同一用户的进程(或者甚至不能检查,如果进程设置为不可转储/不可追踪和其他特殊警告)。
我没有设法找到记录的
proc(5)
是,通常在符号链接上显示的访问权限proc/[pid]/fd/
反映了文件描述符的打开方式。因此打开只读(ls -l /proc/self/fd/9 9</dev/null
)、只写(ls -l /proc/self/fd/9 9>/dev/null
)或读写(ls -l /proc/self/fd/9 9<>/dev/null
)将分别显示这些访问权限:同样,使用创建的(未命名的)管道
pipe(2)
将有一个处于读取模式的 FD 和一个处于写入模式的 FD。套接字是双向的:没有只读或只写“打开”它们的概念,实际上从来没有open(2)
对它们进行系统调用。它们将被视为lrwx------
反映它们可以被读取或写入。