2011-09-10 35 views
1

我有一个程序运行在命令行(即$ run program启动提示符),该程序运行数学计算。它有它自己的提示,它接受文本输入并通过标准输出/错误回应(或者根据需要创建单独的x窗口,但可以禁用)。有时我想发送一个小输入文件,其他时候我会发送一个大文本文件,并在每行中填入一系列输入。这个程序需要大量的资源,并且启动时间很长,所以最好每次只运行一个实例。我可以保持打开程序提示并以这种方式提供输入,或者我可以使用退出命令(留下提示)来发送进程,该命令仅打印输出。用退出命令发送请求的问题是程序必须每次启动(慢...)。此外,这个程序的输出有时是神秘的,它有助于以某种方式过滤输出(例如,简化输出,应用ANSI颜色等)。与后台进程(I/O)进行双向通信

这一切都让我想要在程序周围放置一些双向IO过滤器(或者是“管道”?或“包装器”?),以便程序可以作为单个进程在后台运行。然后,我会与它沟通,而无需重新启动。我也希望将这一切都过滤出来,以便更加用户友好。我一直在寻找各种各样的想法,而且我很难理解如何在一些简单的外壳无障碍庄园中实现这一点。

我尝试过的一些事情是将stdin和stdout重定向到文件,但程序挂起(不退出),只读取一次文件使我无法继续通信。我认为这是因为在EOF之后提示正在等待一些用户输入。我认为这可以设置为本地服务器,但我不确定如何开始完成该任务。

我很想找到一些简单的方法来实现这一点。此外,如果您可以想到执行此操作的方式,您是否认为有一种方法可以允许通过请求附加或脱离提示?任何帮助和想法将不胜感激。

回答

2

您可以创建两个命名管道(man mkfifo)和输入输出重定向:在

cat > fifoin 

而且这样的:

myprog <fifoin> fifoout 

然后,你可以打开新的终端窗口,并为此在一个其他:

cat < fifoout 

(或者使用tee保存INP UT /输出以及)

转储大的输入文件到程序,用途:

cat myfile > fifoin 
+0

感谢很多答案。我从来没有处理过fifo,所以这是一个很好的练习来学习它们。感谢您带领我到他们!我发现的一件事是,无论是我的OS(OSX)还是myprog(MATLAB)都不喜欢' fifoout'。另外,fifo的格式就像文本文件一样,使得像Cntrl/Alt命令这样的所有关键笔划都不可能(如我所见)。这是一个不幸的缺点,但有其他原因。与“tee”合作愉快友好。另外,如果在后台套接字中设置myprog,我发现“tmux send-keys”是非常宝贵的。 – scicalculator