天天看點

标準I/O流簡介

概述

标準I/O流以及其發展

标準輸入流

标準輸出流

标準錯誤流

在程式設計中,當計算機程式開始執行時,标準流是指計算機程式與其運作環境之間預先連接配接的輸入和輸出通信信道。

三個輸入/輸出(I/O)連接配接的通道分别為标準輸入(stdin)、标準輸出(stdout)和标準錯誤(stderr)。

最初的時候,I/O是通過實體連接配接系統控制台的方式實作的,也就是說我要通過鍵盤進行輸入,然後通過螢幕進行輸出,但是标準流很好地抽象了這一點。

當我們通過互動shell執行指令時,标準流通常連接配接到運作shell的文本終端,但可以通過重定向(redirection)或管道(pipeline)進行更改。

子程序一般繼承其父程序的标準流。

我們知道标準流是處理來自輸入裝置或從應用程式寫入資料的輸入和輸出通道。

資料可以是帶有任何編碼的文本,也可以是二進制資料。

在許多現代的作業系統中,程式的标準錯誤流(stderr)被重定向到日志檔案中,通常用于錯誤分析。

标準流可以用于連結應用程式,這意味着一個程式的輸出流可以重定向為另一個應用程式的輸入流,這點我們用過Linux就會有所了解,當我們使用時使用時,應用程式名稱由垂直條字元分隔,是以通常稱為管道字元(pipeline character)。

在大多數早于Unix的作業系統中,程式必須顯式地連接配接到适當的輸入和輸出裝置。例如,在許多系統中,需要獲得對環境設定的控制,通路本地檔案表,确定預期的資料集,并在穿孔卡讀卡器、錄音帶驅動器、磁盤驅動器、行式列印機、卡片穿孔或互動終端的情況下正确處理硬體。

而Unix系統的幾個突破性進展之一是抽象裝置,我們寫程式的時候不再需要知道或關心與我們的程式進行通信的裝置種類。

Unix通過資料流的概念消除了我們寫程式時要做的很多複雜的事情。

Unix的另一個突破是自動将輸入和輸出分别關聯到終端鍵盤和終端顯示,預設情況下我們寫的程式完全沒有必要去為典型的輸入過程輸出程式建立輸入和輸出(特殊的需求除外)

但是在很早以前(還沒有Unix的時候),我們寫的程式通常需要一些複雜的作業控制語言來建立連接配接。

正式由于Unix提供了标準流,是以UnixC運作時環境也必須支援它。是以,無論作業系統如何,大多數C運作時環境(還有C++)都提供同等的功能。

标準輸入是進入到我們寫的程式的流資料(通常是文本)。程式使用讀取操作請求資料傳輸。當然并不是所有程式都需要流輸入,比如做一下1+1等于幾,當然不需要标準流輸入輸出啦。

除非使用重定向,否則标準輸入将從父程序繼承。在互動shell的情況下,标準輸入通常與鍵盤關聯。标準輸入的檔案描述符為0;

标準輸出是我們寫的程式中寫入到輸出資料的流。程式通過寫操作請求資料傳輸。當然,也并非所有程式都生成輸出。

除非重定向,否則标準輸出也是将從父程序繼承。在互動shell的情況下,通常是啟動程式的文本終端。标準輸出的檔案描述符為1;

标準錯誤是我們寫的程式中用來輸出錯誤消息或診斷的另一個輸出流。

注意标準錯誤流是獨立于标準輸出的,也可以單獨地進行重定向。标準錯誤流一般也是在文本終端輸出,即使标準輸出被重定向了。

例如,管道中程式的輸出被重定向到下一個程式的輸入,但每個程式的錯誤仍然直接進入文本終端。

将标準輸出和标準誤差引導到同一目的地(如文本終端)也是可以的。消息的出現順序與我們的程式中将它們寫入的順序相同,除非考慮到緩沖的情況。