给出两个程序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
)才能继续发送数据。
A在B终止的那一刻收到SIGPIPE。解决方法是:
exec 3<>pipe
A >&3 &
B <&3 &
这样,当fifo被打开以供另一个进程读取时,当B死时,内核不会向A发送SIGPIPE;即B不是从中读取的最后一个过程。