2011-11-28 82 views
1

我想在Linux系統上有一些讀取(2)行爲的精確度, 我試圖創建一個shell,並在讀取輸入時遇到問題。 我這樣做無限讀取(2)與管道命令

read(0, BUF, 4096); 

所以事情是bash的(也是最殼)可以通過管道這樣的命令:

echo ls | bash 

擊將執行LS只有一次,但是當我做這個讀總是給我返回相同的緩衝區,「ls」 因此它進入無限循環。 我想知道爲什麼閱讀(2)不會返回我0謝謝你。

回答

3

您需要檢查read的返回值。如果它返回0,那麼它到達輸入流的末尾。也就是說,不是這樣的:

read(0, BUF, 4096); 

你需要寫:

int bytes_read = read(0, BUF, 4096); 

,然後檢查是否bytes_read爲零。

+0

非常感謝!我現在明白了! – r3dalice

+0

不客氣! – ruakh

1

您可能在每次讀取後都不清除緩衝區。如果沒有什麼可讀的,read()將返回0並且不向緩衝區寫任何內容。如果緩衝區沒有被清除,那麼之前的任何內容仍然會在那裏,這就是爲什麼你繼續得到你的無限ls - 那裏仍然只有原始的ls,但你仍然把它當作新的輸入。

+0

這是非常感謝你的問題! – r3dalice