2013-03-11 91 views
0

我需要实现(在Qt中)在Linux机器上运行的两个程序之间进行通信的一些解决方案。一个是工人,另一个是看门狗。基本上我需要看门狗定期检查工作人员,如果出现问题(没有进程,挂断 - 没有工人回答)kill Worker(如果存在)并重新启动它。 Worker作为一个守护进程运行,所以我认为从unix /etc/init.d/worker开始它会是适当的。 我可以看到两个解决方案两个节目信号或共享内存之间的通信?

  1. Unix的信号 - 他们都可以发送和接收的Unix SIGUSR1
  2. 共享内存

选择哪一个? 有信号的程序都必须知道其他pid,可能从文件系统/ var/run读取,因此看起来像一个缺点。 使用共享内存,我需要的只是程序将进行硬编码的“关键”,所以不需要从文件系统读取pid。由于看门狗应该首先启动,它可以创建共享的MEM段,并且Worker只会附加到它并可能更新其时间戳值?但是,为了阻止看门狗工作者(在挂机的情况下)看门狗仍然需要Worker pid来发送给他SIGKILL,也许它可以从共享内存中读取它?这两个概念对我来说都是新的。

那么构建可靠的看门狗的正确方法是什么?或者我错过了什么?

问候

马立克

回答

0

我认为这是通过Qt的提供最佳的解决方案:

http://qt-project.org/doc/qt-4.8/qlocalsocket.html

http://qt-project.org/doc/qt-4.8/qlocalserver.html

的QLocalSocket类提供了一个当地的插座。在Windows上,这是一个 命名管道,在Unix上,这是一个本地域套接字。

http://qt-project.org/doc/qt-4.8/ipc-localfortuneserver.html

http://qt-project.org/doc/qt-4.8/ipc-localfortuneclient.html

希望有所帮助。

+0

谢谢,这是我没有考虑过的。我会去的。 – user2018761 2013-03-12 09:37:03