Shell 在“cat”时无法找到文件描述符文件

Shell 在“cat”时无法找到文件描述符文件

我创建了一个 TCP 套接字并尝试检查其文件描述符。我可以毫无问题地列出它:

[/proc/24846/fd]$ ls -al 11
lrwx------ 1 danb danb 64 10-Sep-19 22:58 11 -> 'socket:[38186892]'

但是尝试cat或写入该文件失败,因为 shell 突然找不到该文件:

[/proc/24846/fd]$ echo 'hello' > 11
bash: no such device or address: 11
[/proc/24846/fd]$ cat 11
cat: 11: No such device or address

我不期望这些命令做任何有用的事情,但至少应该保持一致性并且应该找到该文件。那么为什么 shell 在执行这些特定操作时找不到该文件呢?

澄清一下,我不是想知道如何通过 VFS 与套接字通信,而是想知道为什么我无法对此文件执行文件操作。

答案1

它并没有找不到该文件。这是一个不同的错误消息;比较cat /does-not-exist(实际上cat没有找到它,不是外壳)或echo > /path/does/not/exist(外壳没有找到它):

$ echo > /path/does/not/exist
bash: /path/does/not/exist: No such file or directory

您可能会回来ENODEV或者ENXIO相反,请参阅man 2 openstrace(关于cat案件)可以肯定地告诉你。我在这里得到ENXIO

$ ls -l 3
lrwx------. 1 anthony anthony 64 Sep 10 17:39 3 -> 'socket:[11714498]'

$ strace -e open,openat -f cat 3
openat(AT_FDCWD, "3", O_RDONLY)         = -1 ENXIO (No such device or address)

相关内容