【问题标题】:A way to communicate between applications within linux一种在 linux 中的应用程序之间进行通信的方法
【发布时间】:2013-04-10 14:56:53
【问题描述】:

我目前正处于计划阶段,可以提供帮助。我将使用插入各种模块(i2C、USB 等)的 rasberry pi,这些可以是任何模块,例如测量温度、风速、方向等的模块。

这个想法是让每个模块运行自己的守护进程,这个守护进程会根据请求向主程序提供数据,或者主程序可以请求守护进程重新启动。

所有这些都将在树莓派上发生,而不是通过任何类型的网络。

我的问题是使用什么来在主程序和守护进程之间进行通信。我一直在阅读有关使用 dbus 的信息,但有不少人说将其作为最后的手段。

我已经研究了一段时间,无法想出任何其他(也许更简单)的方法。

附带说明,将它们分开的想法是因为如果任何模块有问题,我可以轻松地重新启动它而不会影响主程序。

【问题讨论】:

  • 我猜这个问题并不仅限于树莓派。 “标准”方式包括 UNIX 套接字(参见 Brendan 的回答)或共享内存(查看 Pi 站点上的此页面:Shared Memory)。
  • 是的,我同意,它并不仅限于 RPi。
  • 另一种较慢同步(每 x 分钟)的方法是文件 - 类似于共享数据库或简单地为每个守护程序记录由主程序解析的文件。

标签: linux daemon raspberry-pi


【解决方案1】:

查看 ZeroMQ。这是类固醇上的插座。

它很容易上手,非常适合同一进程中的线程之间或不同进程之间的通信。 ZMQ 消除了多线程和进程通信通常意味着的许多令人头疼的问题。

只需在“主程序”中使用socket.bind,在客户端中使用socket.connect

在您的情况下,您可能对 Pub-Sub 模式感兴趣,其中服务器订阅,客户端发布,这意味着它是一种单向通信。

否则,您可能对 Req-Router-Dealer-Rep 模式感兴趣。

http://www.zeromq.org/

【讨论】:

    【解决方案2】:

    我只会使用unix sockets

    Unix 域套接字的 API 类似于 Internet 套接字,但它不使用底层网络协议进行通信。

    我无法链接到示例,因为您没有提供语言,但基本上服务器会在文件系统的某个地方打开一个套接字(最好是它具有读/写访问权限的地方,但所有其他程序只有读访问权限)。然后客户端程序可以连接到该套接字并发送请求,就像通过 Internet 一样。

    【讨论】:

      【解决方案3】:

      好吧,有一种观点认为,您应该将应用程序执行的每项工作编程为一个单独的、离散的程序,该程序只执行一项工作,然后通过 shell 将它们相互传递或在需要时调用它们中的每一个通过你的主程序。

      如果需要,只需在后台运行的几个程序(必须爱&)被杀死,并且易于轮询。

      您知道,无需重新发明轮子。

      【讨论】:

      • 他不是在问为什么/是否应该这样做,而是在问如何。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-18
      • 2012-03-01
      • 1970-01-01
      • 2012-06-20
      • 1970-01-01
      相关资源
      最近更新 更多