【发布时间】:2013-07-04 05:35:37
【问题描述】:
在 UNIX 进程之间交换中等大量数据(数兆字节,但不是千兆字节)的最佳方法是什么?
我想,应该是内存映射文件,因为大小限制seem tolerable enough.
我需要双向通信,所以普通管道无济于事。据我所知,对于套接字和 UDP,存在大小限制(另见 here)。
不确定,如果使用 TCP 在 fork() 的子进程和父进程之间进行通信是一个好主意。
阅读this等相关问题,有人推荐共享内存/mmap,也有人推荐sockets。
还有什么我应该研究的吗?例如,是否有一些更高级别的库通过提供例如帮助 IPC数据的XML序列化/反序列化?
由于 cmets 而编辑:
在我的特殊情况下,有一个父/控制器进程和几个子进程(不能使用线程)。控制器根据请求为孩子提供一些可能适合一个 UDP 包的关键数据。孩子对密钥数据进行操作,并根据密钥向控制器提供信息(信息大小可以为 10-100MB)。
问题:响应数据的大小,在密钥请求时通知父级的机制,同步 - 父级在传递给子级后必须从其列表中删除密钥,不应发生重复的密钥处理。
不得使用 Boost 和其他第三方库(很遗憾)。我也许可以使用 SunOS 5.10 系统提供的库。
【问题讨论】:
-
你可以有两个管道,每个方向一个。
-
什么算“大尺寸”?兆字节、千兆字节、兆兆字节,还是更大?普通文件或内存映射文件是合理的候选者......
-
哦——那是宝贝大的东西。 :D 一次将修改多少数据?您是否需要在程序运行之间保留记录?写入模式是随机的吗?读取模式是随机的吗?读取模式是否与写入模式相关(您是否将其视为一个巨大的循环缓冲区,或者当写入者写入其他地方时,阅读器是否可以在整个地方阅读)?
-
不需要持久性,我可能会使用共享内存而不是内存映射文件(因为文件提供持久性)。您只需要小心协调对读写器之间任何给定区域的访问即可。您说数据流是双向的,因此您可能需要 A 通知 B 何时(何地)有新数据,以及 B 何时(何地)通知 A 有新数据的机制。
标签: c++ c serialization ipc mmap