2012-02-08 73 views
1

步驟1:我打開終端和類型爲什麼我的(ubuntu 11.10 bash 4.2.10,x86_64)命名管道堵塞?

mkfifo mypipe 
cat < mypipe 

步驟2:我打開另一個和類型:

for elem in {1..100} ; do echo "$elem" > mypipe ; done 

號的隨機ammount的獲取打印,則第一腳本退出第二個掛起。 請分享wizdom。 Ubuntu的bug?如果需要更多的信息,請問,我不會想象任何相關的atm。

Thx, 你們真棒。

回答

1

命名管道的工作方式是,當寫入過程關閉管道時,讀取過程會收到一個EOF。當cat看到文件已結束時,它停止讀取並退出。這裏bash似乎在循環中大部分時間重用打開的文件,而不是在每次運行中關閉並重新打開文件。

要確保文件被打開,準確地關閉一次,你可以這樣寫:

(for elem in {1..100} ; do echo "$elem" ; done) > mypipe 

要獲得cat輸出只有一個號碼在每個運行,你必須使用程序/bin/echo而不是內置echo。這迫使Bash在循環的每次運行中打開和關閉文件:

for elem in {1..100} ; do /bin/echo "$elem" > mypipe ; done 
1

如果有錯誤,就是cat一面打印多個。這是一個競賽條件。這是怎麼回事則存在cat正在讀一行,然後纔可以事後讀取EOF(因爲它們是單獨寫)的echo寫入下一行,所以cat獲取,等最後,似乎cat到達EOF之前echo重定向可以寫入管道。如果你想cat只得到一次一個

for elem in {1..100} ; do echo "$elem" done > mypipe 

或者更好,

seq 100 > mypipe 

:如果你想所有的數字立刻寫信給管中,將重定向到最後。 ..我不太清楚你如何輕鬆做到這一點(雖然我相信如果有必要,我可以破解它)。