【问题标题】:linux fifo, when read peer returns, write peer will also return immediately?linux fifo,当read peer返回时,write peer也会立即返回?
【发布时间】:2017-07-24 09:54:09
【问题描述】:

我在 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

令我惊讶的是,当“读取”完成时,我的“tty1”中的“猫”也立即返回。我“echo $l1”将打印“line1”。这对我来说很奇怪,因为我希望读者对等应该读取所​​有写入到 fifo 的内容,然后作者对等 (tty1) 将返回。但实际结果是,一旦 reader peer 结束,writer peer 也随之结束。

我只是好奇

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

(2) 除了“cat”命令作为读取器转储fifo之外,shell编程有没有办法一行一行地读取这个fifo?

请多多指教,谢谢!

【问题讨论】:

    标签: linux return fifo writer reader


    【解决方案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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-13
      • 2017-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-14
      • 2020-03-20
      • 2010-10-14
      相关资源
      最近更新 更多