Standard streams (標(biāo)準(zhǔn)流) 介紹

實(shí)際場景

  1. 在操作Linux命令行的時候,如果需要將日志到處并保存到某個文件,我們可能會用到命令 2>&1,將“正常日志”和“錯誤日志”都放在一起。
  2. 在寫Java應(yīng)用時,我們經(jīng)常會用到 System.out.println(.....) 來打印程序運(yùn)行時的一些信息,實(shí)際上Java還提供了 System.err.println(.....) 方法用來打印程序出錯時候的信息。

介紹

在Unix系統(tǒng)及類Unix系統(tǒng)中,Standard streams(標(biāo)準(zhǔn)流)是計算機(jī)程序與其環(huán)境之間,信息輸入和輸出的通道。包括stdin,stdout和stderr.
根據(jù)POSIX協(xié)議,這3個標(biāo)準(zhǔn)流都有自己對應(yīng)的文件描述符(File_descriptor)

文件描述符(整數(shù)值) 名稱 <unistd.h>符號常量 <stdio.h>文件流
0 Standard input STDIN_FILENO stdin
1 Standard output STDOUT_FILENO stdout
2 Standard error STDERR_FILENO stderr
Standard Streams

起源

a. 標(biāo)準(zhǔn)流(Standard streams)的起源

在Unix之前的操作系統(tǒng),程序必須明確指出鏈接到合適的輸入和輸出數(shù)據(jù)。對這當(dāng)中的許多系統(tǒng)而言,這牽涉一些錯綜復(fù)雜而又與特定操作系統(tǒng)相關(guān)的事,過程相當(dāng)復(fù)雜(如控制環(huán)境設(shè)置、訪問一個文件表格、決定區(qū)域數(shù)據(jù)集、和決定讀卡器、磁帶、磁盤、打印機(jī)、打卡機(jī)或交互式終端機(jī))。

Unix 的偉大開創(chuàng)貢獻(xiàn)之一,就是是提供 抽象設(shè)備 :它免除了程序須要知道或在意它正與哪個設(shè)備溝通。 Unix 借由數(shù)據(jù)流的概念來消除這種復(fù)雜。數(shù)據(jù)流是指一種數(shù)據(jù)字節(jié)的有序序列,在其讀到文件結(jié)尾(End of file, EOF)之前可以一直被讀取。另一個 Unix 突破為默認(rèn)自動鏈接輸入和輸出,程序(或者說編寫它的程序員),不用為了文件的輸入、輸出操心。在此之前,程序員需要用復(fù)雜的工作控制語言創(chuàng)建鏈接,協(xié)調(diào)責(zé)任。

b. 文件描述符(File_descriptor)的起源

linux為了實(shí)現(xiàn)一切皆文件的設(shè)計哲學(xué),不僅將數(shù)據(jù)抽象成了文件,也將一切操作和資源抽象成了文件,比如說硬件設(shè)備,socket,磁盤,進(jìn)程,線程等。這樣的設(shè)計將系統(tǒng)的所有動作都統(tǒng)一起來,實(shí)現(xiàn)了對系統(tǒng)的原子化操作,大大降低了維護(hù)和操作的難度,想想看,對于socket,硬件設(shè)備,我們只要讀讀寫寫文件就能對其進(jìn)行操作是多么爽的一件事。

那么在操作這些所謂的文件的時候,我們不可能沒操作一次就要找一次名字吧,這樣會耗費(fèi)大量的時間和效率。咱們可以每一個文件操作一個索引,這樣,要操作文件的時候,我們直接找到索引就可以對其進(jìn)行操作了。我們將這個索引叫做文件描述符(file descriptor),在系統(tǒng)里面是一個非負(fù)的整數(shù)。每打開或創(chuàng)建一個文件,內(nèi)核就會向進(jìn)程返回一個fd,第一個打開文件是0,第二個是1,依次遞增。

Linux的根目錄/dev是 Device(設(shè)備)的縮寫。該目錄下存放的是 Linux 的外部設(shè)備,在 Linux 中訪問設(shè)備的方式和訪問文件的方式是相同的。從該目錄下的內(nèi)容也可以看到標(biāo)準(zhǔn)流的影子

$ ll /dev |grep std
lrwxrwxrwx   1 root root          15 Jul 27 16:54 stderr -> /proc/self/fd/2
lrwxrwxrwx   1 root root          15 Jul 27 16:54 stdin -> /proc/self/fd/0
lrwxrwxrwx   1 root root          15 Jul 27 16:54 stdout -> /proc/self/fd/1    
$ # Linux的文件描述符可以通過 /proc/PID/fd/ 路徑獲取使用。

應(yīng)用

  1. Linux命令行中,可以通過重定向符號(例如:>)來控制標(biāo)準(zhǔn)流的輸出,使用實(shí)例。
  2. Java應(yīng)用當(dāng)中,也可以通過java.lang.Process類來讀取/寫入標(biāo)準(zhǔn)流,可參考源碼方法注釋。

Ref:

  1. https://en.wikipedia.org/wiki/Standard_streams
  2. http://www.itdecent.cn/p/504a53c30c17
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容