shell - 与命名管道分离而不终止源程序

标签 shell pipe ipc wireshark

给定两个程序 A 和 B。 A 产生输出。 B 消耗输入。 在 Linux 上,您可以使用 A | 连接它们。 B.

或者,如果我想拆分这些程序的执行,我可以使用命名管道:

mkfifo pipe
A > pipe &
B < pipe &

但是,如果我终止 B,A 也会被杀死。

有没有办法在多次重新启动B的同时将A连接到B? B 在不运行时丢失数据(例如在以下示例中被杀死期间)并不重要。 以下是我的目标,但它不起作用:

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

为什么我需要这个?

在我的例子中,A 是 Wireshark 的 JSON 输出,我正在开发 B 来解析正确的数据。 我想以交互方式执行此操作,但为此我需要 Wireshark(或 tshark)来继续发送数据。

我知道 this 可能存在重复项和 that ,但是我的问题有所不同。我没有忘记将A重定向到其他地方,我可以提前准备一下。

最佳答案

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

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

这样,当 B 由于 fifo 已打开供另一个进程读取而死亡时,内核不会向 A 发出信号;即 B 不是最后一个从中读取的进程。

关于shell - 与命名管道分离而不终止源程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61427554/

相关文章:

javascript - Electron 渲染器中的IPC从缺少的函数__dirname引发错误

bash - 如何按字母顺序循环文件夹直至某些文件夹

linux - 读取两列数据文件并在 bashscript 中写入第一列的第一个元素

c - C中的多管道bash风格

c - 管道()和 fork ()

linux - 当从我的 c 程序中调用时,如何将数据传递给使用 stdin/stdout 的 zlib 的 zpipe 可执行文件?

c - 消息队列(msgget - msgsnd - msgrcv)Linux - EIDRM

shell - 获取文件中的特定字符并交换列

linux - QProcess 传递(shell)参数

c++ - 跨平台双向IPC