[英]Is stdout Ever Anything Other Than a Console Window?
來自http://www.cplusplus.com/reference/iostream/cout/ :
默認情況下,大多數系統都將其標准輸出設置為控制台,其中顯示了文本消息,盡管通常可以重定向。
我從來沒有聽說過一個系統,其中stdout
不是控制台窗口,默認情況下或其他方式。 我可以看到如何重定向它在打印是一項昂貴的操作的系統中可能是有益的,但這在現代計算機中應該不是問題,對吧?
當然可能是。 我可能想要將標准重定向到文本文件,另一個進程,套接字等等。
默認情況下它是控制台,但是有多種原因可以重定向它,最有用的(與Unix哲學同步)是將一個程序的輸出重定向到另一個程序的輸入。 這允許人們創建許多小的,輕量級的程序,這些程序相互饋送並作為較大系統的離散部分工作。
基本上,它只是一種簡單而強大的共享數據機制。 由於我上面提到的原因,它在* nix系統上更受歡迎,但它也適用於Windows。
在大多數系統上,您可以將標准輸入/輸出/錯誤重定向到其他文件描述符或位置。
例如(在Unix上):
./appname > output
將stdout從appname重定向到名為output的文件。
./appname 2> errors > output
將stdout
重定向到名為output的文件,將stderr
中的所有錯誤重定向到名為errors的文件。
在unix系統上,您還可以讓程序打開文件描述符並將其指向stdin
,例如:
echo "input" > input
cat input | ./appname
這將導致程序從管道中讀取stdin
。
這就是在unix中你可以將各種不同的實用程序“管道”在一起以創建一個更大的工具。
find . -type f | ./appname | grep -iv "search"
這將運行find
命令,並將其輸出並將其輸入到./appname,然后appname
的輸出將被發送到grep
的輸入,然后搜索單詞“search”,只顯示匹配的結果。
它允許許多小型實用程序具有非常強大的效果。
想想>
, <
和|
像管道。
>
就像水槽中的排水管一樣,它接受數據並將其存儲在您想要放置的位置。 當shell遇到>
,它將打開一個文件。
> file
當shell看到上述內容時,它將使用標准系統調用open
文件,並記住該文件描述符。 在上述情況下,由於沒有輸入,它將創建一個空文件,並允許您鍵入更多命令。
banner Hello
這個命令用非常大的字母將Hello寫入控制台,並使其滾動(我在這里使用Unix,因為它是我最熟悉的)。 輸出只是寫入標准輸出。 使用“接收器”( >
),我們可以控制輸出的位置,所以
banner Hello > bannerout
將導致banner的標准輸出中的所有數據重定向到shell打開的文件描述符,從而寫入名為bannerout
的文件。
管道的工作方式類似於>
,因為它們有助於控制數據的流向。 但管道無法寫入文件,只能用於幫助數據流從一個點到另一個點。
例如,這里有流經幾個變電站的水和廢物清潔:
pump --from lake | treatment --cleanse-water | pump | reservoir | pump > glass
水從湖中流過,通過管道到達水處理廠,從工廠流回到將其移動到水庫的泵,然后再次泵入市政水管並通過水槽進入玻璃。
請注意,管道只是將所有輸出連接在一起,最終它最終會在您的玻璃杯中。
它與命令相同,並在Linux上的shell中處理它們。 它還遵循了獲得最終結果的途徑。
現在有一個我在之前的陳述中尚未討論過的最后一件事,那就是<
輸入字符。 它的作用是從文件中讀取並將其輸出到程序上的stdin。
cat < bannerout
將簡單地打印存儲在bannerout中的內容。 如果您有要處理的文件,但由於不想在鏈中運行額外的命令而不想預先添加cat <file>
,則可以使用此方法。
試試這個:
echo "Hello" > bannerinput
banner < bannerinput
這將首先將字符串“Hello”放在文件bannerinput
,然后當您的運行橫幅時,它將從文件bannerinput
讀取。
我希望這可以幫助您了解重定向和解壓縮在Unix上是如何工作的(如果不是大多數也將適用於Windows)。
到目前為止,所有的答案都是在調用程序的東西(shell,無論如何)的上下文中。 程序本身可以使stdout
不是終端。 C標准庫提供了freopen
,它允許程序員在任何兼容的環境中重定向stdout。 POSIX提供了許多其他機制( popen
, fdopen
,...),為程序員提供了更多的控制。 我懷疑Windows提供了類似的機制。
任何數量的事情都可能發生在三個標准文件描述符0,1和2中。任何人都可以使用附加到他們喜歡的任何內容的文件描述符來啟動新進程。
例如,GNU屏幕將輸出放入管道並允許動態重新連接會話。 SSH獲取輸出並將其返回到另一端。 當然,所有眾多的shell重定向器都經常使用操作文件描述符。
對於具有stdout
的程序,它必須在托管實現(具有操作系統的實現) 上運行, 或者在具有附加功能的獨立實現上運行 。
我很難在沒有某種控制台的情況下想出這樣的實現,但讓我們假設Mars Rover有一個完整的操作系統並且用C(或C ++)編程並且沒有那個控制台
/* 2001-07-15: JPL: stdout is the headquarters */
puts("Help. I'm stuck.");
可能已將消息發送給NASA總部。
如果你運行這樣的程序,Windows和Linux都會將stdout
重定向到一個文件:
my_program > some_file
這是最常見的情況,但許多其他類型的重定向都是可能的。 在Linux上,您可以將stdout
重定向到支持“文件描述符”接口的任何內容,例如管道,套接字,文件和各種其他內容。
可能想要重定向stdout的情況的一個簡單示例是將信息傳遞給另一個程序。 Unix / Linux命令ps
生成屬於當前用戶的進程列表。 如果此列表很長並且您想要搜索特定進程,則可以輸入
ps | grep thing
這會將ps
的stdout
重定向到grep thing
的stdin
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.