在Linux上通过C ++代码启动/停止守护进程

我正试图find一种方法来从我的程序启动自定义守护进程。 守护进程本身是使用双分叉机制实现的,如果直接启动,可以正常工作。

到目前为止,我已经遇到了各种启动守护进程的方法:

  1. 创build一个init脚本并将其安装到init.d目录。
  2. 使用start-stop-daemon命令启动程序。
  3. 创build.desktop文件并放置在其中一个自动启动path中。

虽然已知前两种方法使用命令行启动服务,但第三种方法是在用户login时自动启动服务(或任何其他应用程序)。

到目前为止,我的猜测是程序可以使用exec()系列函数直接执行,或者可以通过system()函数执行“start-stop-daemon”命令。

有没有更好的方法来启动/停止服务?

一般情况下,初始化是从shell脚本完成的,这些脚本将调用你的C ++程序,然后执行它的双叉。 注意,它也应该关闭不需要的文件描述符,使用setsid()和可能的setpgid / setpgrp(我不记得这些是否也适用于Linux),可能chdir(“/”)等。有一些相当正常在Stevens书中描述的事情 – 更多信息请参阅http://software.clapper.org/daemonize/daemonize.html

如果守护进程应该以root或其他系统用户帐户运行,那么系统/etc/init/或/etc/init.d/机制就是让脚本停止|开始|等待守护进程的合适位置。

如果deamon应该是给用户的,并且在他/她的账户下运行,那么你有两个选择。

1).desktop文件 – 我个人不是粉丝,但是如果它也为你注销(比如让你关闭你的守护进程),它可能是可行的。

2)对于控制台登录,〜/ .bash_login和〜/ .bash_logout – 你可以让守护进程的包装支持这些运行命令来启动它并(稍后)将其关闭。 后者可以通过将PID保存在文件中或使.bash_login保存在.bash_logout将在稍后使用的变量中完成。 这可能涉及到一些调整,以确保两个脚本每次运行一次,只有最外层的登录shell(通常.bashrc的东西留在.bashrc中,而.bash_login需要启动之前为登录shell读入它)守护进程,所以PATH等将被建立)。

3)对于图形环境,你需要找到从你的X窗口管理器运行的包装脚本。 我正在使用lightdm,并在某个时候/etc/X11/Xsession.d/40×11-common_xsessionrc结束运行我的〜/ .xsessionrc,它给了我一个启动任何我想要的钩子(我有它运行我〜/ .xinitrc其中运行我的窗口管理器和一切),以及以后的地方拍摄的一切。 由于缺乏用户控制的标准化,使得查找钩子非常烦人,因为使用不同的登录管理器(例如lightdm和gdb)可以改变钩子的位置。

4)完全不同的方法是让用户的crontab启动守护进程。 运行“man 5 crontab”并查找特殊的@reboot选项,让任务在启动时运行。 我自己并没有使用它 – 有一个根本限制的机会,但它很容易测试,你只需要考虑当系统发送一个SIGTERM信号时,你的守护进程在系统关闭时正常(快速)存在(见/ etc / init.d / sendingigs的细节)。

希望从中得到帮助。