在Linux中将数据发送到多个进程

时间:2014-06-26 15:57:07

标签: linux unix interprocess inter-process-communicat

我需要以不同的速率更新具有多个不同数据的多个进程,但速度高达10 Hz。我不希望接收进程必须主动获取这些数据,而是将其推送到它们,这样它们只需要在实际存在任何(无轮询)时对新数据执行任何操作。

我只向每个进程发送了几个字节的数据。传输的数据不太可能需要永久存储,至少在被接收者接收和处理之前不需要存储。此外,没有数据的更新频率低于每几秒一次,因此接收器崩溃不是问题(一旦崩溃的接收器恢复,它可以等待下一次更新)。

我已经看过unix域套接字和UDP以及一些管道和共享内存,但似乎它们并不适合我正在尝试做的事情:

  • 域套接字要求发件人向每个收件人发送单独的邮件(即,不进行广播/多播)
  • 共享内存的缺点是让客户端检查数据是否已更新(除非有一种我不熟悉的机制可以通知他们)
  • UDP不保证消息会到达(可能不是同一台计算机上的通信问题?),我对网络堆栈的开销(域套接字没有)有一些担忧/ LI>

对TCP(以及支持设备间通信的其他协议)的关注是,单个设备上的进程间通信不需要这些功能,这可能会产生不必要的开销。

对参考资料和资源的任何建议和指导表示赞赏。

2 个答案:

答案 0 :(得分:3)

你看过zeroMQ了吗?它是一个轻量级的消息传递库,支持多种传输机制上的各种推/拉访问模式。

答案 1 :(得分:2)

一种选择是在同一个盒子上写平面文件或SQLite数据库。

还有另一个控制文件,其中包含进程共享的互斥锁,条件变量和记录计数,映射到发布者和订阅者的内存中。这是通知机制。

通过这种方式,您可以在文件或数据库中获得完整的记录历史记录,从而可以轻松地重放记录,从崩溃中调试和恢复订阅者。

出版商会:

  1. 将控制文件映射到内存中。
  2. 将新记录添加到文件或数据库中。
  3. 锁定互斥锁。
  4. 更新记录计数。
  5. 条件变量的notify_all。
  6. 解锁互斥锁。
  7. 订阅者将:

    1. 将控制文件映射到内存中。
    2. 锁定互斥锁。
    3. 等待条件变量,直到有新记录(每个订阅者维护自己已经处理过的记录的数量)。
    4. 解锁互斥锁。
    5. 处理文件或数据库中的新记录。