2017-03-04 71 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。