4

我有一个关于 C 中守护进程的一般问题,我现在还没有看到答案。

有没有一种方法应该如何实现对守护进程的控制,比如约定或标准?

--休息是进一步的解释--

我已经看到多个文档教授了如何在 C 中创建守护进程的基础知识。分叉、关闭文件描述符、更改根目录等......没问题。当进程进入无限循环时(当创建守护进程时 - 可以这么说),它们都会停止。但这只是编写守护程序的一半。你必须以某种方式控制它。我可以让它以不同的方式工作,但我觉得它还有很多。

为此(检查是否有进程已经在运行或停止正在运行的守护进程,或者......)我已经看到了不同的方法(UNIX 套接字、文件锁、pid 文件......),它们各有优缺点。但在我看来,这像是意见或个人口味。“你为什么不只是……?” 或“我已经这样做了,它对我有用”。我不确定这是否是自由的标志。

我的意思是,如果您查看 sshd、httpd、syslogd 等……它们都可以通过 init-scripts 或服务命令(开始|停止|状态)进行控制。这看起来像一个标准。但这只是很多人试图遵循的一些松散的约定,还是在 C 函数的深海中存在某种“框架”?您是否必须以某种方式使其工作- 例如让您的程序响应“停止”参数并以某种方式结束守护进程?或者是否有某种标准、约定、UNIX 方式、最佳实践……编写“好的、干净的代码”并在大多数环境中很好地集成?

我的主要问题归结为:有没有办法做到这一点?

如果是这样,我在哪里可以找到更多信息?我想还有更多需要注意的事情,而不仅仅是启动和停止。

4

2 回答 2

3

正如您已经注意到的,没有标准,但有一个事实上的标准。

我建议您采用其中一个示例,例如 Apache,并研究 apachectl 的作用。您会发现它基于从文件中读取的 PID 向守护程序发送信号。

对于 Apache,信号是有意义的,因为您不希望某种 HTTP 请求能够停止服务器。对于 DBMS,您可能希望响应传入命令以停止服务器,前提是您首先进行身份验证和授权。

于 2013-02-22T13:48:13.550 回答
2

您可以使用信号,或者守护程序可以创建一个 unix 套接字(具有适当的权限)并侦听 in 上的数据。这取决于您需要对程序实施多少控制。

请记住,对于低流量的事情,可以方便地使用 xinetd 并让它分叉和处理连接,然后响应请求。

于 2013-02-22T14:08:59.313 回答