2013-06-01 146 views
3

我現在正在研究Linux中的一個小型C程序。讓我來解釋一下什麼我想下面另一個Linux命令輸出(管道)作爲我的C程序的輸入

ls | grep hello 

上面的命令是在下面的激情執行的樣品Linux命令這樣做(讓我知道如果我有這個錯誤)

  1. LS命令將被執行的第一
  2. 輸出將給出到grep命令將由匹配「你好」

現在再次生成輸出我想寫一個C程序這需要在p將一個命令的輸出作爲輸入。意思是,在「grep」程序如何能夠從ls命令(在上面的示例中)獲得輸入的類似激情中。

類似的問題已經被問另一個用戶here,但由於某些原因,這個主題已經被標記爲我最初以爲我們可以得到這樣的作爲命令行參數的C程序「不是一個有效的問題」

。但這種情況並非如此。

+2

Unix管道通過['STDIN'和'STDOUT']工作(http://en.wikipedia.org/wiki/Standard_streams)。你只需要閱讀_standard in_來獲得你的輸入,然後寫出_standard out_給你的輸出。 – DaoWen

+0

感謝DaoWen - 我已經通過閱讀STDIN的輸入來實現它 –

回答

3

如果您將輸出從一個命令輸入到另一個命令,則該輸出將在接收進程的標準輸入(stdin)上可用。

您可以使用常用的scanffread函數來訪問它。默認情況下,scanf等在stdin上運行(與默認情況下printf在stdout上運行的方式相同;在沒有管道的情況下,stdin附加到終端),C標準庫爲fread等功能提供FILE *stdin從FILE流中讀取。

對於運行一個文件描述符的函數,POSIX還提供了一個STDIN_FILENO宏,其格式爲unistd.h。這基本上總是0,但依靠這種情況是不好的形式。

+0

謝謝 - 我剛剛使用「scanf」實現了該程序,這已經完成了這個技巧。 –

0

如果其實lsgrep同時啓動。

ls | grep hello表示使用ls的標準輸出作爲grep的標準輸入。 ls將結果寫入標準輸出,grep一次等待並從標準輸入讀取任何輸出。

還有疑惑嗎?做一個實驗。運行

find /會列出計算機上的所有文件,就應該花費大量的時間。

如果ls先運行,然後OS使輸出grep,就要等待很長一段時間,黑屏,直到find成品和grep開始。但是,我們可以立即看到結果,這就是一個證明。

+0

儘管如此,但這並不能完全回答這個問題。 – Cairnarvon

+0

你說得對。它不回答這個問題。我想用評論來描述它,但我想讓它更具可讀性...... –

相關問題