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

时间:2016-03-13 06:08:54

标签: c networking process ipc linux-namespaces

使用更多信息更新问题:

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

使用mmap(),每个进程可能会尝试同时写入地图 时间。此外,当一个进程写入时,其他进程应该能够解决这个问题 out,并使用这个新内容更新他们的数据结构。他们是 允许写入一次,每个进程都知道此前更新。这个 这就是我第一次想到使用UDP多播套接字进行通信的原因, 它适用于32个进程非常好,但它们必须相同 命名空间。

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

感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

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

  • d-bus

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

与老式的IPC相比,它确实是一个更重的基础设施(在软件开发工作方面),这是共享内存,但你会得到以下好处:

  • 注册活动,

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

  • 更少竞争条件问题。

编辑:

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

确定,可以完成。 已完成。为了获得灵感,您可能需要查看依赖于简单共享内存的Android property system design,并且看起来非常成功且可扩展,不是吗? (你甚至可以使用自由许可下的源代码来学习和分叉 - 我在非Android嵌入式产品上使用它。)