【问题标题】:Launch one C++ application from another, and communicate with it从另一个启动一个 C++ 应用程序,并与之通信
【发布时间】:2012-01-05 18:15:57
【问题描述】:

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

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

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

我想我将需要某种从属程序的句柄(也许是它的 pid?),一种发送消息的方法,并且可能是一种让从属程序侦听传入消息的方法。

我没有让单独的 C++ 程序相互通信的经验,所以在这方面的任何提示都将不胜感激。此外,如果有任何特定于 MATLAB mex 的警告,我很想知道这些。


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

【问题讨论】:

  • 就字节而言,“大”有多大,您将多久来回发送一次这样的数据量?
  • 不,数据只会发送到从机程序,不会返回。数据可能在 10Mb 左右,可能更大。

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


【解决方案1】:

您正在寻找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

【讨论】:

  • 你也可以考虑boost process虽然不是官方图书馆。
  • 谢谢,这看起来像我要走的路。
【解决方案2】:

如果您有时间,如之前的答案所建议的那样,您绝对应该选择 IPC。

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

我可以向您推荐的一种方法是使用文件。当你想交流时,过程 1 写下一个包含参数的文件。然后另一个文件说参数已经准备好了。进程 2,有一个循环等待第二个文件。如果找到它,它会删除它,然后读取参数。

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

如果你有很大的参数,你会浪费很多时间把它们写在硬盘上。我建议你更肮脏的东西:安装 RAM,然后在上面写:

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

【讨论】:

  • 适用于许多情况的绝佳答案。我希望做一些更强大的东西,但是这个 KISS 解决方案是一个很棒的解决方案。
【解决方案3】:

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

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

【讨论】:

  • 谢谢,这看起来值得研究。我应该提到我正在 Ubuntu 上构建它,但它最终也会在 Windows 平台上使用(也许这将是最困难的挑战!)
【解决方案4】:

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

【讨论】:

  • 非常感谢。因此,如果我要使用它发送〜10Mb,我应该将它写入共享内存吗?就像在这个例子中boost.org/doc/libs/1_48_0/doc/html/interprocess/… ?
  • 是的 - 我会使用共享内存。您还需要使用condition 之类的东西向您的子进程发出信号,表明共享内存中的数据已准备好使用。
【解决方案5】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-16
    • 1970-01-01
    • 1970-01-01
    • 2014-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多