我有一个由两个进程组成的项目,我需要以快速有效的方式在它们之间传递一些数据。
我知道我可以使用套接字来使用TCP来执行此操作,即使这两个进程始终存在于同一台计算机上,但这似乎不是一个非常有效的解决方案。
我看到很多关于在Linux上使用“管道”的信息。但是我主要想要这个用于Windows和Linux(最好是通过跨平台库),理想情况下是安全类型, 非阻塞方式。
另一个重要的事情是我需要支持整个应用程序的多个实例(即两个进程),每个实例都有自己独立的通信对象副本。
还有一种跨平台的方式来产生一个新的过程吗?
答案 0 :(得分:12)
Boost.Interprocess 简化了常见的进程间通信和同步机制的使用,并提供了大量的内容:
- 共享内存。
- 内存映射文件。
- 信号量,互斥量,条件变量和可升级的互斥锁类型,用于将它们放在共享内存和内存映射文件中。
- 这些同步对象的命名版本,类似于UNIX / Windows sem_open / CreateSemaphore API。
- 文件锁定。
- 相对指针。
- 消息队列。
Boost.Interprocess 还提供更高级别的进程间机制,以动态分配共享内存或内存映射文件的部分(通常,分配固定大小内存段的部分)。使用这些机制,Boost.Interprocess提供了有用的工具来在共享内存和内存映射文件中构造C ++对象,包括类似STL的容器:
已经在以下编译器/平台中测试了
- 在共享内存或内存映射文件中动态创建匿名和命名对象。
- 与共享内存/内存映射文件兼容的STL类容器。
- 类似STL的分配器已准备好实现多个内存分配模式(如池)的共享内存/内存映射文件。
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 :(得分:7)
对于IPC,Windows supports named pipes就像Linux does一样,除了管道名称遵循不同的格式,因为两个操作系统之间的路径格式不同。这是您可以通过简单的预处理器定义来克服的。两个操作系统还支持管道上的非阻塞IO和使用select()的IO多路复用。
答案 2 :(得分:2)
普通的旧TCP应该能够有效地运作;据我所知,现代操作系统将检测TCP连接的两端何时位于同一台机器上,并将通过快速,轻量级(管道式)机制而不是通过普通TCP堆栈内部路由该数据。
因此,如果您已经拥有适用于TCP的代码,我会坚持使用并避免花费大量额外的开发时间来获得不太高的回报。
答案 3 :(得分:1)
它可能有点过分,但您可以使用Apache Portable Runtime; here是线程和进程函数。