Shell

Shell在cating時找不到文件描述符文件

  • September 10, 2019

我創建了一個 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 與套接字通信,而是想知道為什麼我不能對這個文件執行文件操作。

它沒有找不到文件。那是一條不同的錯誤消息;比較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)
⋮

引用自:https://unix.stackexchange.com/questions/540072