【问题标题】:Interprocess communication with a Daemon与守护进程的进程间通信
【发布时间】:2011-10-06 23:08:22
【问题描述】:

我想实现一个 Unix 守护进程(我们称之为 myUnixd),并且希望用户能够通过命令行与这个守护进程进行交互,例如:

myUnixd --help # will display help information
myUnixd --show # will show some data (the's deamon should be doing the work)

所以我的问题是:如何与守护进程通信?我在考虑 Unix 域套接字。有人能告诉我正确的方法吗?

谢谢。

【问题讨论】:

    标签: c unix command-line daemon inter-process-communicat


    【解决方案1】:

    也可以使用Remote Procedure Call (RPC) 进行这种客户端-服务器通信。有不同类型的消息(协议)可以与它一起使用,其中之一是 JSON。

    JSON-RPC 协议非常适合此类任务。您可以找到不同的工具和库来嵌入到您的软件中。在谷歌上快速搜索得到this C library。此类库的优势在于,在您定义所有远程函数调用的 JSON 规范文件中,它会创建客户端和/或服务器 stubs,您可以在开箱即用的代码中使用它们。

    作为侦听器,可以使用套接字,作为其他响应状态,或者只是一个嵌入式 HTTP 服务器,如 microhttpd(和 libcurl 用于客户端)。有很多例子可以重复使用。 HTTP 还允许您在代理后面运行您的客户端。

    【讨论】:

      【解决方案2】:

      使用Berkeley sockets。具体来说,您可以创建一个“UNIX 域套接字”(也称为“本地域套接字”,它将创建一个看起来像文本文件的内容。写入文本文件以将文本发送到守护程序,从中读取以接收文本来自守护进程。您可以通过几个函数调用来实现它。

      如果你想要更高级的东西,你也可以使用DBus,它提供了更复杂的界面,但学习起来更复杂。

      【讨论】:

      • 感谢您的回复,使用 unix 域套接字与守护程序进行本地通信是否正确?你知道我们如何与 mysqld、httpd... 通信(命令行)吗?
      • 根据 Mysqld 的手册页 (linuxcommand.org/man_pages/mysqld1.html,),默认行为是在 /tmp/mysql.sock 中创建一个 Unix 域套接字,但您可以使用 --socket 选项指定不同的路径。至于httpd,你指的是哪个httpd?其中有几个。
      • 谢谢 Max,我的意思是 httpd 是主守护进程,它使用以下命令启动 apache 服务器:httpd start 或 stop...
      • 看起来 Apache 是通过直接向进程发送信号 (en.wikipedia.org/wiki/Signal_%28computing%29) 来做到这一点的,如果您只想让进程做的事情就是退出或挂断,这种方法就可以工作。如果你想发送更多不同类型的命令,信号不会削减它。
      • 谢谢 Max,我认为在我的情况下,更好的方法是像使用本地 unix 域套接字的 mysqld 一样。再次感谢。
      【解决方案3】:

      如果您想使用 telnet 与您的守护进程通信,请使用 tcp 套接字。

      【讨论】:

      • 如果是这种情况,只需将 TCP 套接字绑定到 localhost。否则,您将需要编写自己的(简单)工具来与您的守护进程通信。 Quagga 路由套件就是这样做的。您可以使用 telnet 远程登录到 zebra、ospfd、ospf6d。除了 telnet,quagga 路由套件还提供 vtysh (shell) 来与路由守护进程通信。
      • wcang,是否可以使用 vtysh 和 Quagga 发布到远程主机的路由?
      猜你喜欢
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多