Как закрыть трубу FIFO?

Этот скрипт:

#!/bin/bash tmppipe=/tmp/temppipe mkfifo $tmppipe echo "test" > $tmppipe cat $tmppipe exit 

Не заканчивается. Я предполагаю, что команда cat ждет EOF из трубы; как отправить его?

2 Solutions collect form web for “Как закрыть трубу FIFO?”

Нет, это

 echo test > "$tmppipe" # BTW, you've got the quotes in the wrong places 

это висит. Точнее, это оболочка, открывающая трубу для записи перед запуском echo .

pipe – механизмы взаимодействия между процессами, они должны использоваться между процессами, выполняемыми одновременно . Здесь open(WR_ONLY) ( > ) будет блокироваться до тех пор, пока другой процесс не будет open в режиме чтения.

 echo test > "$tmppipe" & cat < "$tmppipe" 

будет работать, потому что echo и cat запускаются одновременно.

В Linux вы можете избежать:

 exec 3<> "$tmppipe" echo test >&3 cat < "$tmppipe" exec 3<&- 

Это работает, потому что read + write open s ( <> ) на трубах не блокируется в Linux, а потому, что вывод test\n по echo достаточно мал, чтобы вписаться в канал, так что вы можете выполнять запись и чтение последовательно.

Это не сработало бы для большей производительности, например:

 exec 3<> "$tmppipe" seq 100000 >&3 cat < "$tmppipe" exec 3<&- 

Поскольку seq заполнил бы канал (64kiB в текущих версиях Linux) и блокировал бы, пока какой-либо другой процесс не считывал данные с этого канала, чего никогда не произойдет, потому что cat не будет работать, пока не завершится seq .

Обратите внимание, что:

 echo test 1<> "$tmppipe" cat < "$tmppipe" 

не будет работать либо потому, что команда командной строки echo откроет канал, запишет тест, а затем закроет канал (а затем система уничтожит его, поскольку в нем больше нет дескриптора файла). Итак, следующая командная строка cat попытается создать новый канал (и заблокировать до тех пор, пока что-то не откроет файл fifo для записи).

Оказывается, ответ очевиден – труба блокируется echo и никогда не доходит до кота!

Трубы не хранят данные. Когда процесс пытается записать в трубу, запись не может завершиться, пока не будет что-то прикреплено к другому концу трубы, чтобы прочитать ее.

Способом решения этого конкретного примера является использование

 echo "test" > $tmppipe & 

чтобы процесс записи выполнялся в фоновом режиме. Таким образом, он сидит там и ждет, пока сценарий продолжается, пока он не дойдет до cat и не завершится.

  • Как я могу подключать команды к любому терминалу?
  • Как читать веб-камеру, которая уже используется фоном?
  • Включение вывода процесса в файл tar
  • данные о трубах в процесс, который уже запущен
  • Запуск нулевого байта читается на FIFO / pty
  • Как перенаправить журналы на устройство fifo?
  • Запретить stdin ждать первого сообщения из именованного канала
  • закрытие дескрипторов нежелательных файлов
  • bash scripting - читать архив из stdin
  • перенаправление на именованный канал
  • Как безопасно и последовательно запускать трубу?
  • Linux и Unix - лучшая ОС в мире.