首页 > 解决方案 > 从命名管道中分离而不终止源程序

问题描述

给定两个程序 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)继续发送数据。

我知道可能与thisthat重复,但是我的问题是不同的。我没有忘记将A重定向到其他地方,我可以事先准备好。

标签: shellpipeipcwireshark

解决方案


A收到一个SIGPIPE时刻B终止。一种解决方法是:

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

A这样,当Bfifo 被另一个进程打开以供读取时,内核不会发出信号;即B不是从它读取的最后一个过程。


推荐阅读