在不终止源程序的情况下从命名管道分离
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重定向到别的地方,可以提前准备一下
A
在 B
终止时收到 SIGPIPE
。解决方法是:
exec 3<>pipe
A >&3 &
B <&3 &
这样内核不会在 B
结束时发出 A
信号,因为 fifo 已打开供另一个进程读取;即 B
不是从中读取的最后一个进程。
给定两个程序 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重定向到别的地方,可以提前准备一下
A
在 B
终止时收到 SIGPIPE
。解决方法是:
exec 3<>pipe
A >&3 &
B <&3 &
这样内核不会在 B
结束时发出 A
信号,因为 fifo 已打开供另一个进程读取;即 B
不是从中读取的最后一个进程。