使用C/C++编写守护进程(Linux)。

4
我想编写一个通用的(C/C++)库,用来在Linux环境下开发守护进程。与其重复造轮子,我想到这里来看看是否有已知的库在使用。
该库可以是C或C++,尽管我更喜欢C++(也许是基于优秀的BOOST库的一部分?)。
顺便说一句,在选择库方面,由于守护程序是相当“关键”的组件,如果您建议的库由一组开发人员积极维护(例如BOOST库[再次]),具有活跃的社区(或至少有邮件列表可供在遇到棘手情况时求助),而不是某个孤独的个体......将会更好。
我看到了这个文档,这是一个很好的起点,但它有点过时,所以我想知道是否有更好、更为人知/使用的东西......?
顺便说一下,我将在Ubuntu(10.0.4)上进行开发。

start-stop-daemon 可能会有所帮助。 - KitsuneYMG
3个回答

7

另一种解决方案是使用进程监控器,例如supervisord,它可以管理多个服务,当服务崩溃时重新启动它们,提供一个极简的网页来查看和控制进程的状态,可以管理服务组,支持通用的状态变化事件转发机制以及其他好处。这样的工具比守护进程库提供更多的价值。


+1:哎呀,为什么我没想到呢?!这可以节省我很多时间。我会研究一下,看它是否符合我的要求。 - morpheous
您链接的文档是最新的,因为自那时以来守护进程的行为没有发生任何变化。正如Marcelo所说,supervisord非常适合这种类型的事情 - 它甚至可以将简单的/bin/cat程序变成守护进程(请参阅supervisord文档)。 - andreypopp
@Matt:据我所知,upstart不能监控长时间运行的进程或重新启动崩溃的服务。如果我说错了,请您指正,因为我对upstart并不是很熟悉。 - Marcelo Cantos

6
#include <unistd.h>

int daemon(int nochdir, int noclose);

根据标志,哪个分支与控制终端分离,重新打开所有的 {stdin, stdout, stderr} 到 /dev/null,并将工作目录更改为根目录。

1

如果你的守护进程使用 TCP/IP 套接字,你可以使用 inet 守护进程(或 xinetd)。你的进程将根据新的传入连接需求而被启动。然而,在大规模部署时可能会出现可扩展性问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接