2

使用更多信息更新问题:

我在 Linux Ubuntu 14.04 机器上有 32 个网络命名空间,每个命名空间中运行一个 C 程序。我希望程序能够与其他命名空间(不是线程,单独的进程)中的兄弟姐妹共享一些数据。如何才能做到这一点?我无法进行 UDP 多播,因为每个命名空间都有自己的网络堆栈,并且发送到多播域的数据包对其他命名空间不可见。我也无法考虑通过 mmap 内存干净地做到这一点。

使用 mmap(),每个进程可能会尝试同时写入地图。此外,当一个进程写入时,其他进程应该能够弄清楚这一点,并用这个新内容更新他们的数据结构。一旦每个进程都知道这个先前的更新,他们就被允许写。这就是为什么我首先想到使用 UDP Multicast 套接字进行通信的原因,它对 32 个进程非常有效,但它们必须在同一个命名空间中。

此外,据我所知,Unix 域套接字不允许多个读取器/写入器工作。

感谢任何帮助!

4

1 回答 1

1

32 个网络名称空间中的 32 个进程已经非常重要了,所以我猜你想要一些严肃的并且可以扩展的东西。那么我建议您使用现代且可扩展的 Linux IPC 系统。

  • 要么d-bus

  • netlink sockets(不限于网络内容,除非您需要,否则不会干扰您的命名空间)。请参阅此处:“netlink 协议是一种基于套接字的 IPC 机制,用于在用户空间进程本身之间进行通信 [...]。”

与共享内存等老式 IPC 相比,它肯定是更重的基础架构(就软件开发工作而言),但您将获得以下好处:

  • 活动报名,

  • 进程之间的单播/多播/广播通信,

  • 以及更少的比赛条件问题。

编辑:

“是的,这可以通过常规的 Unix IPC 来完成”。

的,当然,这是可以做到的它完成了为了获得灵感,您可能想看看依赖于简单共享内存的Android 属性系统设计,并且似乎非常成功且可扩展,不是吗?(你甚至拥有自由许可下的源代码来学习和分叉——我确实在非 Android 嵌入式产品上使用它)。

于 2016-03-13T09:55:42.433 回答