Отсоединение от именованного канала без завершения исходной программы - PullRequest
2 голосов
/ 25 апреля 2020

Учитывая две программы A и B. A производит вывод. B потребляет ввод. На Linux вы можете соединить их с A | B.

В качестве альтернативы, если я хочу разделить выполнение этих программ, я могу использовать именованный канал:

mkfifo pipe
A > pipe &
B < pipe &

Однако если Я завершаю B, A также убивается.

Есть ли способ подключить A к B, перезагружая B несколько раз? Не важно, что B теряет данные (например, во время уничтожения в следующем примере), когда не работает. Моей целью было бы следующее, но это не работает:

mkfifo pipe
A > pipe &
B > pipe &
kill B
B > pipe &

Зачем мне это нужно?

В моем случае A - это JSON выход из Wireshark, и я разрабатываю B разобрать правильные данные. Я хотел бы сделать это в интерактивном режиме, но для этого мне нужен Wireshark (или tshark) для продолжения отправки данных.

Мне известны возможные дубликаты с this и , которые , однако мой вопрос другой. Я не забыл перенаправить А куда-то еще, я могу подготовить его заранее.

1 Ответ

2 голосов
/ 25 апреля 2020

A получает SIGPIPE в момент, когда B заканчивается. Обходной путь:

exec 3<>pipe
A >&3 &
B <&3 &

Таким образом, ядро ​​не будет сигнализировать A, когда B умрет, так как fifo был открыт для чтения другим процессом; то есть B не был последним процессом чтения из него.

...