【问题标题】:How to correctly terminate processes with named pipe. Unmatched usage of pipes如何使用命名管道正确终止进程。管道的无与伦比的使用
【发布时间】:2014-06-02 23:09:12
【问题描述】:

我制作了 bash 脚本,它调用了两个通过命名管道链接的进程,如下所示:

mkfifo pipe
gnuplot <pipe &
PIPE=pipe apl $*
rm pipe
wait $!

这里apl 通过pipegnuplot 发送命令。当第一个完成时,第二个也应该完成,然后脚本终止。

(注意,问题与aplgnuplot 都不相关,您可以想象任何其他应用程序。

问题是apl 可能会也可能不会打开管道(如果它不需要绘制任何图表)。如果它不打开管道 gnuplot 将永远等待,因此脚本不会终止。

如果我尝试使用 echo 'exit' &gt;pipe 终止 gnuplot,它会在相反的情况下挂起。

如果我只是删除waitgnuplot 将永远在后台等待。

我不能强制apl 打开和关闭管道(它由操作员控制,可能会忘记这样做)。

那么脚本和后台进程应该如何终止呢?

【问题讨论】:

    标签: bash pipe named-pipes terminate


    【解决方案1】:

    如果我在rm pipe 之前插入以下代码,它对我有用:

    exec 3>pipe
    exec 3>&-
    

    说明:第一个exec-call 创建了一个指向pipe 的文件描述符3。第二个exec-call 关闭文件描述符3。在您的情况下,gnuplot 将终止,因为它的 stdin 已关闭 - 无论 apl 是否事先打开它。

    来源:How to avoid echo closing FIFO named pipes? - Funny behavior of Unix FIFOs

    【讨论】:

    • 我发现在您的链接中将exec 3&gt;pipe 放在apl 之前和exec 3&gt;&amp;- 之后也可以。谢谢。
    猜你喜欢
    • 2021-11-01
    • 1970-01-01
    • 2021-07-19
    • 2015-04-12
    • 2021-07-24
    • 1970-01-01
    • 1970-01-01
    • 2011-10-24
    • 1970-01-01
    相关资源
    最近更新 更多