【问题标题】:How could I communicate to a running proccess?我如何与正在运行的进程进行通信?
【发布时间】:2014-11-22 23:44:20
【问题描述】:

我想知道如何与正在运行的进程进行通信,就像 Google Chrome 一样。如果它已经存在任何 Google Chrome 实例并且您单击外部链接(浏览器内部或外部),它会打开一个新选项卡。

那么,我的问题是这种通信是通过套接字或类似的方式发生的吗?

谢谢。

【问题讨论】:

  • tldp.org/LDP/tlk/ipc/ipc.html google 一下“Linux 进程间通信”。
  • 糟糕的例子。 Chrome runs as multiple processes.
  • 您可以使用管道等,正如@Shemhamforasch 建议的那样,但通常 GUI 程序使用操作系统的消息总线。对于诸如 Windows 之类的平台来说,在执行程序中内置“作为窗口启动”的东西也很常见。我不知道细节,所以不是一个完整的答案。

标签: python c linux sockets communication


【解决方案1】:

这实际上取决于您的平台。 GTK+ 有 GtkApplication(它基于 GIO 中的 GApplication 类),Qt 有 QtSingleApplication 等。

GApplication/GtkApplication 基本上会尝试提供一个 D-Bus 名称(至少在 Linux 上——我相信该机制是依赖于平台的)。如果成功则您是原始应用程序,如果不成功则该应用程序已在运行,您可以通过 D-Bus 与其通信。

【讨论】:

  • 其实是我的。我正在对服务器进行编程,我希望能够使用 CLI 更改一些设置。然后,我想最好的方法是提供一个接口来做到这一点。
  • 那么你应该使用对你来说方便的任何东西——如果我是你,我可能只会使用你在服务​​器上使用的任何东西。如果您的服务器是 HTTPd,请使用 HTTP。如果是 ZeroMQ,请使用 ZeroMQ 等。如果您正在编写网络服务器,只需绑定到本地端口。如果您正在编写 D-Bus 服务器,请使用 D-Bus 等。没有一种真正的方法可以做到这一点,因此通常最好利用您已经拥有的任何现有基础设施。
  • 感谢您的回答。当你谈到本地端口时,我搜索了一下,发现了一些关于 Unix Domain Sockets 的东西,它限制了对本地应用程序的访问。
【解决方案2】:

我认为结合thisthis 将解决您的问题。基本上,它可以确定正在运行的应用程序的 pid(如果有的话)并写入其标准输入。您可能希望向该进程发出信号,表明有新信息需要处理(this 应该对此有所帮助)。

套接字、管道、消息和共享内存也是不错的选择,但乍一看这似乎是最简单的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-16
    • 1970-01-01
    • 1970-01-01
    • 2012-05-06
    • 1970-01-01
    • 2012-09-01
    相关资源
    最近更新 更多