2012-01-05 70 views
1

我有一個C++(技術上是MATLAB mex)程序,我計劃使用它在我的系統上啓動一個獨立的純C++從程序。主調用程序可能看起來像下面這樣:從另一個啓動一個C++應用程序,並與其通信

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

從站後推出的,然後,我會想有一個第二MEX程序將與溝通,並把數據發送到從屬程序。發送的數據將以大型C++數組的形式出現。

我想我需要一些處理從屬程序(也許是它的pid?),一種發送消息的方法,並且可能是從程序偵聽傳入消息的一種方法。

我沒有獲得單獨的C++程序相互溝通的經驗,所以在這方面的任何提示將不勝感激。另外,如果有任何特定的MATLAB mex特定的警告,我會很有興趣聽到這些。


編輯:我應該提到,我在Ubuntu建設這一點,但最終會喜歡它在所有平臺上工作。平臺具體的建議非常受歡迎,但多平臺的想法真的是我所追求的。

+0

如何大以字節爲單位是「肥胖型」,以及多久你會被髮送這個數據量來回? – 2012-01-05 18:21:25

+0

不,數據只會發送到從站程序,而不是返回。數據可能大約10Mb,可能更大。 – 2012-01-05 18:23:34

回答

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

無論誰低估,請解釋原因。 – karlphillip 2012-01-05 18:25:46

+0

您可能還想考慮[boost process](http://stackoverflow.com/questions/1683665/where-is-boost-process),但不是官方庫。 – Zac 2012-01-05 18:35:41

+0

謝謝,這看起來像我要去的方式。 – 2012-01-16 13:55:41

1

我強烈推薦所有Windows通信的COM技術。
http://www.microsoft.com/com/default.mspx

順便說一句,如果你想直接使用Matlab代碼,你可以使用Matlab Builder NE編譯COM組件,所以你根本不需要寫mex。

+0

謝謝,這看起來可能值得研究。我應該提到我在Ubuntu上構建了這個功能,但它最終也將在Windows平臺上使用(也許這將是最困難的挑戰!) – 2012-01-05 18:20:33

0

這是特定的平臺,但在POSIX平臺,你可以使用popen(3)來啓動命令,給你一個您可以使用管道將數據寫入其標準輸入(也可以從其標準輸出讀取)。

更便攜但不簡單,Boost.Interprocess庫有各種進程間通信方式。

1

如果您正在尋找通信結賬的跨平臺解決方案boost::interprocess。該文檔還有關於這些工作如何工作的相當多的信息。

+0

非常感謝。所以如果我用這個發送〜10Mb,我應該把它寫入共享內存嗎?像這個例子一樣http://www.boost.org/doc/libs/1_48_0/doc/html/interprocess/quick_guide.html? – 2012-01-05 18:30:41

+0

是的 - 我會使用共享內存。您還需要使用[condition](http://www.boost.org/doc/libs/1_48_0/doc/html/interprocess/synchronization_mechanisms.html#interprocess.synchronization_mechanisms.conditions)等信號發送給您的孩子處理共享內存中的數據已準備好使用。 – alanxz 2012-01-05 21:30:56

2

如果您有時間,正如前面的答案中所建議的那樣,您絕對應該參加IPC。

但是,也有許多「快速和骯髒」的解決方案,您不需要花時間閱讀任何文檔。

我可以推薦你的一個就是使用文件。當你想進行通信時,進程1用參數寫下一個文件。然後另一個文件來說明參數已經準備就緒。進程2,有一個循環等待這個第二個文件。如果它找到它,它會刪除它,然後讀取參數。

我知道這是骯髒的,但這是非常快的程序,並且不需要讀取任何文檔。

如果您有大量參數,並且您將浪費大量時間將它們寫入硬盤。我建議你的東西更髒:在其上安裝的RAM,和寫作:

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

適用於許多情況。我正在尋找一些更強大的東西,但這個KISS解決方案是一個很棒的解決方案。 – 2012-01-16 13:55:28

相關問題