Я на Linux, и я изначально ожидал, что для файла fifo, когда я сбрасываю в него некоторый контент писателем, писатель будет ждать, пока прочитанный одноранговый узел прочитает «все» его содержимое, а затем вернется. Но похоже не так, как я ожидал, у меня был простой эксперимент:
Прежде всего, я создал файл fifo:
$mkfifo hfifo.txt
Затем у меня был файл «my.txt», содержащий несколько строк:
$cat my.txt
line1
line2
line3
line4
Я открываю «tty1» для записи в hfifo.txt с помощью my.txt:
cat my.txt >hfifo.txt
Я открываю другой терминал «tty2», чтобы прочитать из него одну строку:
$read l1<hfifo.txt
Что ж, к моему удивлению, когда «чтение» заканчивается, «кошка» в моем «tty1» также немедленно возвращается. Я "echo $l1" напечатает "line1". Это довольно странно для меня, потому что я ожидал, что одноранговый узел чтения должен прочитать все содержимое, записываемое в fifo, а затем одноранговый узел записи (tty1) вернется. Но фактический результат заключается в том, что как только читатель заканчивается, писатель тоже заканчивается.
Мне просто любопытно
(1) как коллега-писатель узнает, что больше нет читателей, которые могли бы прочитать fifo, чтобы он закончился? Я мог бы зациклиться, чтобы вызвать команду «чтение» для печати каждой строки этого файла.
(2) Помимо команды «cat» в качестве считывателя для дампа fifo, есть ли способ для программирования оболочки читать этот fifo построчно?
Пожалуйста, предложите, спасибо!