使用单个广播唤醒多个进程的最简单方法是什么?

时间:2015-04-13 02:55:45

标签: c linux

上下文:这是一个web / sqlite应用程序。一个进程通过TCP接收新数据,并将它们提供给SQLite数据库。当客户端通过HTML5的服务器端事件接口连接和请求更新时,将根据需要启动其他进程(数字是可变的)(将来可能会更改为websocket)。

这个想法是强制客户端应用程序阻止,并找到一种方法让服务器创建一个通知,唤醒所有等待客户端。

请注意,客户端无法从服务器进行分叉。

我希望找到一个解决方案:

  • 不要求客户将自己注册到服务器
  • 允许服务器进行广播,即使没有客户端正在收听 - 并且没有创建大量未处理的通知
  • 允许客户端检测到服务器不存在
  • 允许客户端定义自定义超时(事件的最长等待时间)

检查解决方案:

  • sqlite3_update_hook() - 只能在一个进程中运行(该死的,本来应该很流畅)
  • 信号:我上次使用信号时仍然做噩梦。也许signalfd会更好(服务器创建一个文件夹,客户端创建唯一文件,服务器通知该文件夹中的所有文件)
  • iNotify - 对此没有足够的阅读
  • 信号量/锁定/共享内存 - 无法想到使用这些内容的非黑客方式。服务器可以使用刚刚插入数据库中的行的行ID更新共享内存区域,但接着是什么?

我确定我错过了一些明显的东西 - 但是什么?在这个时候,民意调查似乎是最好的选择!

感谢。

1 个答案:

答案 0 :(得分:0)

正如建议您可以尝试消息队列吗?多个客户端可以连接到同一个队列并接收一个广播消息,如果每个客户端需要与服务器通信,则它们可以拥有自己的消息队列。 消息队列由Linux OS实现,非常可靠。我个人使用消息队列将消息从几个客户端传递到中央路由守护进程,客户端负责处理和返回更改的数据。