2009-08-05 55 views
4

我有一個由兩個進程組成的項目,我需要以快速和高效的方式在它們之間傳遞一些數據。C++多進程?

我知道,我可以使用套接字來做到這一點使用TCP,即使這兩個進程將始終在同一臺計算機上,但是這似乎並沒有成爲一個非常有效的解決方案。

我看到在Linux上使用「管道」大量的信息。不過,我主要希望這是Windows和Linux(最好通過一個跨平臺庫),理想情況下在一個類型安全,非阻塞方式 。

另一個重要的事情是我需要支持整個應用程序(即兩個過程),每個通信對象的自己的獨立副本的多個實例。

也有一個跨平臺的方式來產生新的進程?

回答

7

對於IPC,Windows supports named pipes就像Linux does,除了管道名遵循不同的格式,因爲在兩個操作系統之間的路徑格式的差異。這是你可以用簡單的預處理器定義克服的問題。這兩種操作系統都支持使用select()方法管道上的非阻塞IO和IO多路複用。

1

這可能是矯枉過正,但你可以使用Apache的便攜式運行; here是線程和進程函數。

12

看一看Boost.Interprocess

Boost.Interprocess中簡化了使用共同的進程間通信和同步的機制,並提供了寬範圍的其中:

  • 共享存儲器。
  • 內存映射文件。
  • 信號量,互斥,條件變量的和可升級的互斥鎖類型將它們放置在共享存儲器和存儲器映射的文件。
  • 這些同步對象的命名版本,類似於UNIX/Windows sem_open/CreateSemaphore API。
  • 文件鎖定。
  • 相對指針。
  • 消息隊列。

Boost.Interprocess中還提供更高級別的進程間機制來動態地分配的共享存儲器或存儲器映射的文件的部分(通常,分配一個固定大小存儲器段的多個部分)。使用這些機制,Boost.Interprocess中提供了有用的工具構建C++對象,包括STL類容器,共享內存和內存映射文件:

  • 動態創建的匿名和命名對象的共享內存或內存映射文件。
  • 與共享內存/內存映射文件兼容的類STL容器。
  • 類STL分配器準備好共享內存/內存映射文件,實現多種內存分配模式(如池化)。

Boost.Interprocess中已在以下編譯器/平臺上進行了測試:

  • 視覺7.1的Windows XP
  • 視覺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 Mac系統10.4.1
+2

boost :: interprocess在窗口上有一個虛擬實現,它使用忙等待所有內容。我不會自己推薦它。 – bdonlan 2009-08-05 20:04:46

2

普通老式TCP應公平地提高工作效率;據我瞭解,現代操作系統將檢測TCP連接的兩端何時位於同一臺計算機上,並將通過快速,輕量級(管道式)機制而不是通過普通TCP堆棧在內部路由該數據。

所以如果你已經有了能夠通過TCP工作的代碼,那麼我堅持這樣做,並且避免花費大量額外的開發時間來獲得很多回報。

+0

什麼操作系統,你說什麼?請與我分享。 – Test 2009-10-12 12:00:50

+0

如果是Linux,我確信它不是,因爲數據包可以被tcpdump捕獲,而2在同一臺機器上結束。 – Test 2009-10-12 12:04:24

+0

我的帖子主要基於我在Unix Sockets FAQ站點與RobSeace的對話,您可以在這裏閱讀: http://www.developerweb.net/forum/showthread.php?t=5154 In特別是,Rob引用這句話:「是的,Unix域套接字將會更加高效,繞過很多內核TCP/IP協議棧,這對本地IPC來說是不必要的(儘管如果你使用127.0.0.1,大多數現代系統也應該對回送接口進行相當多的優化......)「 – 2009-10-12 16:57:41