stdin stdout stderr 標準流本質上到底是什麼?

時間 2021-06-01 19:01:20

1樓:BHEscaper

$ ls -l /dev/std*

你將得到下面的結果

... /dev/stderr -> /proc/self/fd/2

... /dev/stdin -> /proc/self/fd/0

... /dev/stdout -> /proc/self/fd/1

上面那些究竟是什麼?

stdin/stdout/stderr 是三個符號連線,分別指向箭頭後面的三個檔案。

那麼後面的三個檔案又是什麼?

... /proc/self/fd/0 -> /dev/pts/0

... /proc/self/fd/1 -> /dev/pts/0

... /proc/self/fd/2 -> /dev/pts/0

又是三個符號連線……

Don't PANIC! 實際上你已經抓到它們了。

stdin / stdout / stderr 的本體就是這個 /dev/pts/0

——但是,先等等。

可你得到的結果不是0,而是 1,2,3,4……

而且如果你用 Ctrl + Alt + F1 ~ F6 進入了 TTY 的話,

那麼結果將是 /dev/tty1 ~ tty6

這是怎麼回事?

你應該已經猜到了,那個 self 指的就是程式自身。

而下面 fd 中的 0,1,2,3…… 就是對應開啟檔案的符號連線。

現在讓我們來做乙個小實驗。

$ bash 3> /tmp/output

現在我開啟了乙個新的 bash ,並把檔案描述符3給了 output 。

$ ls -l /proc/self/fd/3

接下來的事你應該已經猜到了——

... /proc/self/fd/3 -> /tmp/output

現在我們從新開的 bash 裡退出來。

$ exit

然後把3換成1。

$ bash 1> /tmp/output

$ ls -l /proc/self/fd/1

不好,我們現在看不到輸出了!

$ exit

$ cat /tmp/output

恭喜你,你已經會搶答了——

... /proc/self/fd/1 -> /tmp/output

總結一下:

對於應用層來說,stdin / stdout / stderr 實際上就是在程式開始執行時被預設開啟的檔案而已,跟你自己用 fopen()/open() 去開啟乙個檔案沒有區別,而有區別的地方在於——

無論是 tty0 ~ tty6 也好,還是 /pts/0 等等也好,它們不是普通的檔案,而是裝置檔案—— Linux 宣稱一切皆檔案,因為在底層上 Linux 把檔案和裝置統一起來用 inode 來管理。

如果有時間的話,我會試著把 fopen() 的前生今世給捋一遍,屆時當你 fopen() 乙個檔案(inode)時究竟發生了什麼就會大白於天下。

2樓:

其實流就是資料 I/O 的一種模型。

至於 stdin/stdout/stderr,其值可以看成是 OS 給它的。

有的情況下在建立程序的時候還可以將這些流重定向到某些地方,所以並不一定是 console 上。

如 Windows 中 console 的路徑是 CON( http://

);Linux 可能是 /dev/console。

此外在建立程序的時候也可以重定向子程序的標準輸入/輸出( http://

3樓:汪朝輝

UNIX中一切都是檔案,磁碟等裝置在作業系統看來都是檔案。對檔案進行操作時,需要開啟這個檔案獲得檔案描述符(file descriptor, fd)。而每個程序生來就有三個檔案描述符繫結在它們身上。

分別指向標準輸入、標準輸出和標準錯誤。上面答案提到的控制代碼名稱較多出現在windows中。

4樓:邱昊宇

C99 §7.19.1/3

stderrstdinstdout

which are expressions of type 『『pointer toFILE』』 that point to theFILEobjects

associated, respectively, with the standard error, input, and output streams.

歌詞大意:stderr / stdin / stdout 分別指向與標準錯誤流 / 標準輸入流/ 標準輸出流相關聯的 FILE 物件

至於流(Stream)是什麼:

C99 §7.19.2/1

Input and output, whether to or from physical devices such as terminals and tape drives,

logical data streams, whose properties are more uniform than their various inputs and

outputs. 歌詞大意:物理裝置的輸入輸出、儲存裝置上的檔案的輸入輸出,都對映到邏輯上的概念「資料流」,可以抹除一些裝置之間的屬性差異。

至於 stdin / stdout / stderr 的值是多少:

不知道、也不該知道。

文學本質上是什麼?

好難受,路我走,已不可能再回頭,應天炮,忘憂草,明天早上說聲好,忍著笑,悲別離,太陽根本不不鳥我,曹尼瑪,陰天陣陣垂人眼,搞學習,搞學習,書到用時方恨少 舒緩情緒 艾姆沃夫 從理論上來說,普遍認可文學本質上是一種審美意識形態。從內容上來說,個人認為,文學歸根結底說的是人,本質上是對人生存境遇,情感訴...

權力本質上是什麼?

安靜地吹牛 乙個國家或組織很大 乙個人管不了,也不想管 所以劃分區域和方面成n個 再遞迴多次,得到小塊 權力主要就是三個方向分類 接受上級傳遞的命令向下傳遞並要求,將下級數值彙總向上報告,在本級產生想法判斷 數值 發起乙個命令,或設定本領域的一組資料權力就體現在調節這三個的大小與迴圈。 其他人的服從...

追星本質上是追什麼?

阿猹 追你內心的影子,追你想成為的自己。你喜歡某個明星不是因為他真的是那樣的,而是因為他表現出來的某個點戳中了你,然後你幻想他是那樣的人。所以你追的,其實是自己的幻想。自從醒悟了這一點後,我就再也不會真情實感的追星了,最大的程度也就是路人粉了,嘻嘻嘻。 每個人都是不一樣的吧。對我來說追星純粹是對乙個...