linux fifo,当读取peer返回时,write peer也会立即返回?

时间:2017-03-04 07:13:14

标签: linux return fifo writer reader

我在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",从中读取一行:

$read l1<hfifo.txt

对我来说很好,因为&#34;阅读&#34;完成,&#34; cat&#34;在我的&#34; tty1&#34;也立即返回。我&#34;回声$ l1&#34;将打印&#34; line1&#34;。这对我来说很奇怪,因为我期望读者对等方应该读取写入fifo的所有内容,然后写入对等方(tty1)将返回。但实际结果是,一旦读者同伴结束,作家同伴也会结束。

我只是好奇

(1)作家同伴如何知道没有更多的读者阅读fifo所以它完成了?我可以在一个循环中呼叫&#34;阅读&#34;命令打印此文件的每一行。

(2)在&#34; cat&#34;旁边命令作为转储fifo的读者,有没有办法让shell编程一行读取这个fifo一行?

请建议,谢谢!

1 个答案:

答案 0 :(得分:1)

&#39; strace的&#39;派上用场了。对于包含3个字符+换行符的文件,您可以看到以下行:

spark.sql.streaming.schemaInference

正如你所看到的,read()和write()都返回读取的字符数,并且在最后一次交互中返回零,这表示进程已经结束。

respectins(2)有些命令可以执行其他操作,例如sed awk和egrep,它们也逐行读取文件,但只读取文件,AFAIK only cat。