【问题标题】:Writing a unix daemon编写一个 unix 守护进程
【发布时间】:2012-10-25 23:39:45
【问题描述】:

我正在尝试在 Unix 中编写一个守护程序。我了解如何使守护程序启动并运行的部分。现在我希望守护程序在我在 shell 中键入命令时响应,如果它们是针对守护程序的。

例如:

假设守护进程名称是“mydaemon”

在终端 1 中,我输入 mydaemon xxx。 在终端 2 我输入 mydaemon yyy。

“mydaemon”应该能够接收参数“xxx”和“yyy”。

【问题讨论】:

  • 您是说您希望能够在第一次启动守护程序时将命令传递给它,还是您的意思是您启动了一个守护程序并且它是正在运行,对“mydaemon”的连续调用向已经运行的进程发送指令?
  • 我的意思是对“mydaemon”的连续调用向已经运行的进程发送指令。

标签: unix daemon


【解决方案1】:

如果我正确解释了您的问题,那么您必须将其作为应用程序级构造来执行。也就是说,这是特定于您的程序的东西,您必须自己编写代码。

我将采用的方法是编写“mydaemon”,并将其作为包装器:它检查进程表或 pid 文件以查看“mydaemon”是否已在运行。如果没有,那么 fork/exec 你的新守护进程。如果是这样,则将参数发送给它。

对于“将参数发送给它”,我将使用命名管道,如下所述:What are named pipes? 本质上,您可以将命名管道视为类似于“stdin”,除了它们作为文件出现在其余部分系统,因此您可以在运行的“mydaemon”中打开它们并检查它们的输入。

最后,应该注意的是,所有这些检查-if-running-send-to-pipe 的东西都可以在您的守护程序中使用 *nix OS 的 API 完成,也可以在使用例如脚本'ps'、'echo' 等...

【讨论】:

  • 谢谢,我还有一个问题,假设我想返回新请求“mydaemon yyy”,表明您的请求已被接受,我可以在命名管道中写入内容并在另一端也是?
  • 我不认为一个管道可以做到这一点——你可以用多个管道来做到这一点——但使用 Unix 套接字beej.us/guide/bgipc/output/html/multipage/unixsock.html 可能会更好地为你服务——特别是,看看结尾描述socketpair() 的文章。使用 Unix 套接字感觉更像是使用完整的网络套接字,这可能是一个优势——将你的守护进程移植为网络服务几乎是微不足道的——而且(如果你做得对的话)你的守护进程和任何其他程序。
猜你喜欢
  • 2023-03-26
  • 2011-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多