在不终止源程序的情况下从命名管道分离

Detach from named pipe without terminating source program

给定两个程序 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 是 Wireshark 的 JSON 输出,我正在开发 B 来解析正确的数据。 我想以交互方式进行,但为此我需要 Wireshark(或 tshark)来继续发送数据。

我知道 this and that 可能重复,但我的问题不同。没忘记把A重定向到别的地方,可以提前准备一下

AB 终止时收到 SIGPIPE。解决方法是:

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

这样内核不会在 B 结束时发出 A 信号,因为 fifo 已打开供另一个进程读取;即 B 不是从中读取的最后一个进程。