linux fifo, когда чтение однорангового узла возвращается, запись однорангового узла также возвращается немедленно?

Я на 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 построчно?

Пожалуйста, предложите, спасибо!


person Hind Forsum    schedule 04.03.2017    source источник


Ответы (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, которые также читают файл построчно, но просто читать файл, насколько мне известно, только cat.

person a_at_cyber_dot_training    schedule 04.03.2017