如何解释以下报告内容的不一致/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/8
ll /dev/fd/
3
/proc/24334/fd
ll
...我现在还注意到日期不同 - 我是否得到了不同的目录 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
ll
255
单独显示链接到的文件/dev/pts/8
这是 bash shell 内部使用的文件描述符,使用该标志打开它,当系统调用用于执行另一个程序时(就像您的情况一样),O_CLOEXEC
它会自动关闭。execve(2)
/bin/ls
我进一步注意到,我无法在 /dev/fd 中创建文件(使用任一路径)。
在 Linux 上的文件系统中无法创建文件procfs
。
但是,您可以在 下的任何目录上挂载另一个文件系统/proc
,或者在 下的任何路径上绑定挂载任何文件或目录/proc
。就像其他地方一样。