我在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一行?
请建议,谢谢!
答案 0 :(得分:1)
&#39; strace的&#39;派上用场了。对于包含3个字符+换行符的文件,您可以看到以下行:
spark.sql.streaming.schemaInference
正如你所看到的,read()和write()都返回读取的字符数,并且在最后一次交互中返回零,这表示进程已经结束。
respectins(2)有些命令可以执行其他操作,例如sed awk和egrep,它们也逐行读取文件,但只读取文件,AFAIK only cat。