问题描述
我想将大量的输入信息输入到一个连续运行的程序中(在我的情况下是gnuplot,但它可以是任何程序)。 问题在于,在第一个块之后,程序认为它已完成并终止。 我正在用bash命令演示这一点:
在终端1中:创建一个命名管道,让cat
监听它:
mkfifo pipe
cat <pipe
在2号航站楼中:将块放入管道中
echo foo >pipe
echo bar >pipe
第一个echo
完成后,cat
终止。如何使它继续运行并处理更多输入?
解决方法
答案被掩埋在here(C++
案例中):
方法是在读写模式下打开管道。这样,阅读过程也将是写作过程,只要管道打开,它就永远不会被所有作者关闭。
命名管道设计为在完成所有编写器(在本例中为一个echo命令)时关闭。要使其保持打开状态,请以读写模式使用它:
cat <>pipe
最后,必须手动关闭阅读器,或者通过提供一个可以理解为退出命令的特殊序列(因为EOF
不再执行此操作),将其杀死。例如,对于gnuplot和其他类似shell的程序,我可以说echo exit >pipe
。