Linux
為什麼我不能用文本編輯器閱讀 /dev/stdout?
我剛開始學習Linux 上的 Everything Is A File TM,這讓我想知道如果我真的從 /dev/stdout 讀取會發生什麼:
$ cat /dev/stdout ^C $ tail /dev/stdout ^C
(這
^C
是我在程序掛起後殺死程序)。當我嘗試使用 時
vim
,我收到無法想像的消息:“/dev/stdout”不是文件。喘氣!那麼,當我嘗試閱讀這些“文件”時,為什麼會出現掛斷或錯誤消息?
為什麼我會掛斷電話
您不會從
cat(1)
and中獲得“掛斷”tail(1)
,它們只是阻止讀取。cat(1)
等待輸入,並在看到完整行後立即列印:$ cat /dev/stdout foo foo bar bar
我在這裡輸入
foo``Enter``bar``Enter``CTRL
-D
。
tail(1)
等待輸入,並僅在可以檢測到時列印EOF
:$ tail /dev/stdout foo bar foo bar
在這裡我再次輸入
foo``Enter``bar``Enter``CTRL
-D
。或錯誤資訊
Vim 是唯一一個給你錯誤的。它這樣做是因為它執行
stat(2)
反對/dev/stdout
,並且它發現它沒有S_IFREG
設置位。
/dev/stdout
是文件,但不是正常文件。事實上,核心中有一些舞蹈可以在文件系統中為其提供一個條目。在 Linux 上:$ ls -l /dev/stdout lrwxrwxrwx 1 root root 15 May 8 19:42 /dev/stdout -> /proc/self/fd/1
在 OpenBSD 上:
$ ls -l /dev/stdout crw-rw-rw- 1 root wheel 22, 1 May 7 09:05:03 2015 /dev/stdout
在 FreeBSD 上:
$ ls -l /dev/stdout lrwxr-xr-x 1 root wheel 4 May 8 21:35 /dev/stdout -> fd/1 $ ls -l /dev/fd/1 crw-rw-rw- 1 root wheel 0x18 May 8 21:35 /dev/fd/1