与C ++程序中的脚本通信

时间:2010-12-13 23:09:50

标签: c++ communication

我有一个c ++程序(非常复杂,代码和执行时间都很长)。 偶尔这个程序停止并调用用户指定的shell脚本。

在调用脚本之前,我的程序会创建一个包含当前数据的.out文件。我通过system()命令调用脚本。然后,该脚本将读取.out文件,并创建自己的script.out文件并退出。

然后system()函数调用结束,我的程序读取并解析script.out文件。

问题:有没有更好的方法在我的c ++程序和随机shell脚本之间执行通信?

我的意图是在两者之间进行充分沟通。脚本可以虚拟地“询问”程序“你现在有什么数据?”该计划将以一些严格的公约回复。然后脚本可以说“添加此数据...”,或“删除所有以前的数据”等等。

我需要这个的原因是因为shell脚本告诉程序修改它的数据。放在原始.out文件中的确切数据。因此,在完成修改后 - 程序保存的实际数据与.out文件中写入的数据不对应。

谢谢!

P.S。 我发誓我已经四处寻找,但每个人都建议使用中间文件。

4 个答案:

答案 0 :(得分:3)

如果没有中间文件,肯定有办法做到这一点。最常见的方法是使用命令行参数进行输入,使用管道进行标准输出;其他人也使用管道输入。 system最直接的替代方法是使用popen

答案 1 :(得分:1)

在类似unix的系统上?也许pipe (2)对您有用吗?

从手册页(Mac OS X 10.5版):

  

概要
       #include< unistd.h>

int pipe(int fildes[2]);
     

说明
       pipe()函数创建一个管道(一个允许单向的对象)        数据流)并分配一对文件描述符。第一个描述 -        tor连接到管道的读取端;第二个连接到        写完。

当然,您必须使用forkexec对来创建管道。可能这已经得到了详细的回答,现在你知道要搜索什么......


我这样做了一段时间,但是:

  • 在主要流程中,在分叉子流程之前,您需要拨打pipe两次。现在你有两个管道并控制它们的两端。
  • 你叉。
    • 主进程将从一个管道读取并从另一个管道写入。无论哪个是哪个,但你需要明确这一点。
    • 子进程将调用其中一个exec函数系列,将其图像替换为您要运行的shell的图像,但首先使用dup2用两根管子的末端替换它的标准输入和输出(同样,这是你需要清楚哪个管子在哪里)。

在他看来,你有两个进程,主进程可以将事物发送到一个管道广告,它们将在脚本的标准输入上接收,脚本写入其标准输出的任何内容将被发送到另一个管道到控制过程。所以他们轮流,就像与shell交互一样。

答案 2 :(得分:0)

您可以使用管道或(可能更方便)套接字 - 例如前端到gdb,或者期望这样做。这需要更改您的shell脚本,并从system()切换到更低级fork()exec()

这是相当复杂的,所以请更加具体地说明您的环境以及需要澄清的内容。

答案 3 :(得分:0)

您正在询问有关进程间通信(IPC)的问题。

有很多方法可以做到这一点。您可以进行简单的搜索,互联网将为您提供最多的答案。

如果我没错,Google Chrome会使用名为命名管道的技术。

无论如何,我认为最“便携的方式”可能是一个文件。但是,如果您知道自己正在使用哪种操作系统,那么绝对可以使用大多数IPC技术。