linux fifo,当读peer returns 时,write peer 也会立即return?

linux fifo, when read peer returns, write peer will also return immediately?

我在 linux 上,我最初预计对于一个 fifo 文件,当我将一些内容转储到写入器中时,写入器将等待读取对等方读取 "all" 它的内容然后 return。但是好像和我预想的不太一样,我做了一个简单的实验:

首先,我创建了一个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

令我惊讶的是,"read" 完成后,我的 "tty1" 中的 "cat" 也会立即 return。我 "echo $l1" 将打印 "line1"。这对我来说很奇怪,因为我预计 reader 对等点应该读取所​​有写入 fifo 的内容,然后写入对等点(tty1)将 return。但实际结果是,一旦 reader peer 结束,writer peer 也结束。

我只是好奇

(1) writer peer 如何知道没有更多 reader 读取 fifo 所以它完成了?我可以循环调用 "read" 命令来打印此文件的每一行。

(2) 除了 "cat" 命令作为 reader 转储 fifo,有没有办法让 shell 编程一行一行地读取这个 fifo?

请多多指教,谢谢!

'strace' 派上用场了。您可以看到包含 3 个字符 + 换行符的文件的以下行:

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

如您所见,read() 和 write() return 读取的字符数,最后一次交互 return 为零,表示进程已结束。

regardins (2) 还有一些命令可以做其他事情,比如 sed awk 和 egrep 也可以逐行读取文件,但仅读取文件,AFAIK 仅 cat.