我有一个c ++程序(非常复杂,代码和执行时间都很长)。 偶尔这个程序停止并调用用户指定的shell脚本。
在调用脚本之前,我的程序会创建一个包含当前数据的.out
文件。我通过system()
命令调用脚本。然后,该脚本将读取.out
文件,并创建自己的script.out
文件并退出。
然后system()
函数调用结束,我的程序读取并解析script.out
文件。
问题:有没有更好的方法在我的c ++程序和随机shell脚本之间执行通信?
我的意图是在两者之间进行充分沟通。脚本可以虚拟地“询问”程序“你现在有什么数据?”该计划将以一些严格的公约回复。然后脚本可以说“添加此数据...”,或“删除所有以前的数据”等等。
我需要这个的原因是因为shell脚本告诉程序修改它的数据。放在原始.out文件中的确切数据。因此,在完成修改后 - 程序保存的实际数据与.out文件中写入的数据不对应。
谢谢!
P.S。 我发誓我已经四处寻找,但每个人都建议使用中间文件。
答案 0 :(得分:3)
如果没有中间文件,肯定有办法做到这一点。最常见的方法是使用命令行参数进行输入,使用管道进行标准输出;其他人也使用管道输入。 system
最直接的替代方法是使用popen
。
答案 1 :(得分:1)
在类似unix的系统上?也许pipe (2)
对您有用吗?
从手册页(Mac OS X 10.5版):
概要
#include< unistd.h>int pipe(int fildes[2]);
说明
pipe()函数创建一个管道(一个允许单向的对象) 数据流)并分配一对文件描述符。第一个描述 - tor连接到管道的读取端;第二个连接到 写完。
当然,您必须使用fork
和exec
对来创建管道。可能这已经得到了详细的回答,现在你知道要搜索什么......
我这样做了一段时间,但是:
pipe
两次。现在你有两个管道并控制它们的两端。exec
函数系列,将其图像替换为您要运行的shell的图像,但首先使用dup2
用两根管子的末端替换它的标准输入和输出(同样,这是你需要清楚哪个管子在哪里)。在他看来,你有两个进程,主进程可以将事物发送到一个管道广告,它们将在脚本的标准输入上接收,脚本写入其标准输出的任何内容将被发送到另一个管道到控制过程。所以他们轮流,就像与shell交互一样。
答案 2 :(得分:0)
您可以使用管道或(可能更方便)套接字 - 例如前端到gdb,或者期望这样做。这需要更改您的shell脚本,并从system()
切换到更低级fork()
和exec()
。
这是相当复杂的,所以请更加具体地说明您的环境以及需要澄清的内容。
答案 3 :(得分:0)
您正在询问有关进程间通信(IPC)的问题。
有很多方法可以做到这一点。您可以进行简单的搜索,互联网将为您提供最多的答案。
如果我没错,Google Chrome会使用名为命名管道的技术。
无论如何,我认为最“便携的方式”可能是一个文件。但是,如果您知道自己正在使用哪种操作系统,那么绝对可以使用大多数IPC技术。