Linux

為什麼我不能用文本編輯器閱讀 /dev/stdout?

  • August 28, 2021

我剛開始學習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

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