在Ubuntu上,我启动命令行程序(gnu步步高)并让它从管道(命令管道)中获取命令,如此
$ gnubg -t < commandpipe
从另一个终端,我做
$ echo "new game" > commandpipe
这个工作正常,新游戏开始,但在程序完成处理该命令后,进程退出。
如何防止步步高进程退出?我想继续通过命令管道向它发送命令。
答案 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