从管道获取命令后进程退出

时间:2014-01-05 21:20:07

标签: linux pipe exit named-pipes

在Ubuntu上,我启动命令行程序(gnu步步高)并让它从管道(命令管道)中获取命令,如此

$ gnubg -t < commandpipe

从另一个终端,我做

$ echo "new game" > commandpipe

这个工作正常,新游戏开始,在程序完成处理该命令后,进程退出。

如何防止步步高进程退出?我想继续通过命令管道向它发送命令。

4 个答案:

答案 0 :(得分:0)

这只是因为您使用了echo,它在回显后立即退出。我相信当一个程序退出它的文件描述符时就会被关闭。 (好吧,它不是bash中的实际程序,它是内置的,但我认为这不重要。)如果你写了一个实际的交互式程序,例如使用GUI(并记住,StackOverflow用于编程问题,而不是Unix问题,属于there)并将其stdout重定向到命名管道,你不会遇到这个问题。

答案 1 :(得分:0)

读者获得EOF,从而关闭FIFO。所以你需要一个循环,如下所示:

$ while (true); do cat myfifo; done | ts
jan 05 23:01:56 a
jan 05 23:01:58 b

在另一个终端:

$ echo a > myfifo 
$ echo b > myfifo 

ts

代替gnubg -t

答案 2 :(得分:0)

问题是文件描述符已关闭,当最后一个写文件描述符关闭时,它会向读取进程发送一个信号。

快速破解,你可以这样做:

cat < z  # read process in one terminal
cat > z &  # Keep write File Descriptor open. Put in background (or run in new terminal)
echo hi > z  # This will close the FD, but not signal the end of input

但是你应该用真正的编程语言编写,你可以控制你的文件描述符。

答案 3 :(得分:0)

要避免EOF,您可以使用tail

tail -f commandpipe | gnubg -t