从另一个启动一个C ++应用程序,并与之通信

时间:2012-01-05 18:15:57

标签: c++ c matlab system-calls mex

我有一个C ++(技术上是MATLAB mex)程序,我打算用它在我的系统上启动一个独立的纯C ++ slave程序。主调用程序可能如下所示:

void mexFunction(int nlhs,mxArray *plhs[],int nrhs,const mxArray *prhs[]){
    system ("path/to/slave/program");
}

一旦启动了从机,我就会想要第二个mex程序,它将与从机程序进行通信并将数据发送到从机程序。发送的数据将采用大型C ++数组的形式。

我想我需要对slave程序(可能是它的pid?)进行某种处理,这是一种发送消息的方法,并且可以说是奴隶程序监听传入消息的一种方式。

我没有经验可以让单独的C ++程序相互通信,所以在这方面的任何提示都会受到赞赏。此外,如果有任何特定的MATLAB mex特定警告,我很想知道这些。


编辑:我应该提到我正在Ubuntu上构建它,但最终会喜欢它在所有平台上运行。平台特定的建议非常受欢迎,但多平台的想法真的是我追求的。

5 个答案:

答案 0 :(得分:8)

您正在寻找IPC (Interprocess Communication)机制。

Boost has an entire chapter就此而言是一个跨平台的解决方案。

  

Boost.Interprocess已经在以下编译器/平台中进行了测试:

Visual 7.1 Windows XP
Visual 8.0 Windows XP
GCC 4.1.1 MinGW
GCC 3.4.4 Cygwin
Intel 9.1 Windows XP
GCC 4.1.2 Linux
GCC 3.4.3 Solaris 11
GCC 4.0 MacOs 10.4.1

答案 1 :(得分:2)

如果你有时间,如前面的答案所示,你一定要去IPC。

然而,还有许多“快速而肮脏”的解决方案,您无需花时间阅读任何文档。

我可以推荐你的是使用文件。当您想要进行通信时,Process 1会记下带有参数的文件。然后另一个文件说参数已经准备好了。进程2,有一个循环等待第二个文件。如果找到它,则将其删除,然后读取参数。

我知道这很脏,但编程速度非常快,无需阅读任何文档。

如果你有大量的参数,你会浪费很多时间在硬盘上写它们。我建议你更脏一点:装上RAM,​​然后写上:

mkdir -p /tmp/ram
sudo mount -t tmpfs -o size=512M tmpfs /tmp/ram/

答案 2 :(得分:1)

我强烈推荐所有Windows通信的COM技术 http://www.microsoft.com/com/default.mspx

顺便说一句,如果你想直接使用Matlab代码,你可以使用Matlab Builder NE编译COM组件,所以你根本不需要编写mex。

答案 3 :(得分:1)

如果您正在寻找用于通信结帐的跨平台解决方案boost::interprocess。该文档还提供了有关这些内容如何工作的大量信息。

答案 4 :(得分:0)

这是特定于平台的,但在POSIX平台上,您可以使用popen(3)启动命令,为您提供可用于将数据写入其标准输入的管道(以及从其标准输出中读取)。

更便携,但不那么简单,Boost.Interprocess库有各种各样的进程间通信方式。