2017-03-04 73 views
0

我在linux上,我最初預計對於fifo文件,當我將作者的一些內容轉儲到作者身上時,作者將等待讀對等讀取其所有內容,然後返回。但似乎並不如我所料,我做了一個簡單的實驗:linux fifo,當讀對等體返回時,寫對等體也會立即返回?

首先,我創建了一個FIFO文件:

$mkfifo hfifo.txt 

然後,我有一個「My.txt文件」的文件,有幾行「:

$cat my.txt 
line1 
line2 
line3 
line4 

我打開一個 「爲tty1」 的編寫與My.txt文件到hfifo.txt:

cat my.txt >hfifo.txt 

我打開另一個終端 「TTY2」,繼續讀下去從中e行:

$read l1<hfifo.txt 

那麼我supprise,爲「已讀」結束,「貓」在我的「爲tty1」也立即返回。我「echo $ l1」將打印「line1」。這對我來說很奇怪,因爲我期望讀者同行應該讀取正在寫入fifo的所有內容,然後作者peer(tty1)將返回。但實際結果是,一旦讀者同行結束,作家同行也就結束了。

我只是好奇

(1)如何作家同行知道,有沒有更多的閱讀器讀取FIFO所以它完成?我可以在一個循環中調用「read」命令來打印這個文件的每一行。

(2)旁邊的「貓」命令作爲閱讀器轉儲fifo,是否有一種方法讓shell編程通過一行讀取這個fifo一行?

請提出建議,謝謝!

回答

1

'strace'派上用場。你可以看到文件的以下幾行3個字符+換行:

read(3, "qqq\n", 131072) = 4 write(1, "qqq\n", 4) = 4 read(3, "", 131072) = 0

正如你所看到的,read()和write()方法返回的字符數讀取,並在最後互爲作用歸零,這個過程已經結束。

關注(2)有一些命令可以執行其他操作,如sed awk和egrep也可以逐行讀取文件,但只讀取文件AFAIK only cat。