/dev/fd 不一致

/dev/fd 不一致

如何解释以下报告内容的不一致/dev/fd

erhannis@mnode6:/dev/fd$ ll /dev/fd/
total 0
dr-x------ 2 erhannis erhannis  0 Jan 12 22:10 .
dr-xr-xr-x 9 erhannis erhannis  0 Jan 12 22:10 ..
lrwx------ 1 erhannis erhannis 64 Jan 12 22:10 0 -> /dev/pts/8
lrwx------ 1 erhannis erhannis 64 Jan 12 22:10 1 -> /dev/pts/8
lrwx------ 1 erhannis erhannis 64 Jan 12 22:10 2 -> /dev/pts/8
lr-x------ 1 erhannis erhannis 64 Jan 12 22:10 3 -> /proc/24334/fd
erhannis@mnode6:/dev/fd$ ll
total 0
dr-x------ 2 erhannis erhannis  0 Jan 12 21:42 .
dr-xr-xr-x 9 erhannis erhannis  0 Jan 12 21:42 ..
lrwx------ 1 erhannis erhannis 64 Jan 12 21:42 0 -> /dev/pts/8
lrwx------ 1 erhannis erhannis 64 Jan 12 21:42 1 -> /dev/pts/8
lrwx------ 1 erhannis erhannis 64 Jan 12 21:42 2 -> /dev/pts/8
lrwx------ 1 erhannis erhannis 64 Jan 12 21:55 255 -> /dev/pts/8

具体来说,请注意,单独显示链接到 的ll文件,但显示链接到 的文件。 (进程号每次都会改变;我怀疑它是它本身的进程号。)255/dev/pts/8ll /dev/fd/3/proc/24334/fdll

...我现在还注意到日期不同 - 我是否得到了不同的目录 for.和 for /dev/fd/?我进一步注意到,我无法在 /dev/fd 中创建文件(使用任一路径)。

答案1

在第一种情况下,ls列出 的内容/dev/fd -> /proc/self/fd -> /proc/<pid_of_ls>/fd,在第二种情况下,列出 的内容/proc/<pid_of_the_shell>/fd

虽然/dev/fd是到 的(神奇的)符号链接/proc/self/fd.(当前目录,如ls不带参数调用时列出的)不是,并且它已经解析为您之前/proc/<pid_of_the_shell>/fd调用时的值。cd /dev/fd

ll255单独显示链接到的文件/dev/pts/8

这是 bash shell 内部使用的文件描述符,使用该标志打开它,当系统调用用于执行另一个程序时(就像您的情况一样),O_CLOEXEC它会自动关闭。execve(2)/bin/ls

我进一步注意到,我无法在 /dev/fd 中创建文件(使用任一路径)。

在 Linux 上的文件系统中无法创建文件procfs

但是,您可以在 下的任何目录上挂载另一个文件系统/proc,或者在 下的任何路径上绑定挂载任何文件或目录/proc。就像其他地方一样。

相关内容