在不同网络命名空间中的进程之间共享状态

Share state between processes in different network namespaces

用更多信息更新问题:

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

使用 mmap(),每个进程都可以同时尝试写入映射 时间。此外,当一个进程写入时,其他进程应该能够认为 出来,并用这个新内容更新他们的数据结构。他们是 一旦每个进程都知道之前的更新,就允许写入。这个 这就是为什么我首先想到使用UDP Multicast socket进行通信的原因, 它适用于 32 个进程,但它们必须在同一个进程中 命名空间。

此外,Unix 域套接字不允许多个 reader/writers 据我所知工作。

感谢任何帮助!

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

  • 或者d-bus,

  • netlink sockets (which are not limited to networking stuff and will not interfere with your namespaces unless you want it). See here:"the netlink protocol is a socket based IPC mechanism used for communication [...] between userspace processes themselves."

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

  • 活动报名,

  • unicast/multicast/broadcast 进程之间的通信,

  • 竞争条件问题少得多。

编辑:

"yes, this can be done with regular Unix IPC"。

感觉这里有趋势

而且肯定,可以做到。 完成。为了获得灵感,您可能想看看 Android property system design,它依赖于简单的共享内存,并且似乎非常成功且可扩展,不是吗? (你甚至可以根据自由许可获得源代码来学习和分叉——我确实在非 Android 嵌入式产品上使用它)。