我创建了一个 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 open
。strace
(关于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)
⋮