守护进程实现步骤

    为了将服务改造成守护进程,需要实现一个函数 daemonize

    该函数负责初始化守护进程,通过返回值可以判断执行是否成功:

    编译并启动守护服务:

    1. $ make all

    注意到,运行 echod 后,程序立马返回了。通过 ps 命令,可以确定 echod 已经作为守护进程在后台运行了:

    1. Jan 9 20:19:10 ant echo-forever[30807]: Hello, world!
    2. Jan 9 20:19:50 ant echo-forever[30807]: Hello, world!

    回头来看看 daemonize 函数的实现,这是本文的重点——初始化守护进程的关键步骤:

    • 12-18 行,调用 系统调用派生子进程,以便实现:①如果守护进程由 shell 启动,父进程退出会让 shell 认为命令执行完毕;②子进程虽继承了父进程的进程组 ID ,但获得新的进程 ID ,保证子进程不是组长进程,为调用 setsid 做准备。
    • 再次调用 并终止父进程,保证守护进程(子进程)不是会话首进程,防止它再次取得控制终端。
    • 42-44 行,关闭所有文件描述符,请注意进程文件描述符范围是如何确定的。
    • 47-52* 行,重新打开 标准输入 ( 0 )、 标准输出 ( 1 )以及 标准错误 ( 2 ),并将其重定向到 /dev/null 上。这样一来,任何试图访问标准输入输出的程序代码均不会产生任何效果。
    • 56-58 行,将当前工作目录更改为根目录,避免有文件系统因守护进程而无法卸载。
    • 61 行,调用 umask 将文件模式屏蔽位设置为一个已知值,一般为 0 。因为继承而来的屏蔽位,可能设置为屏蔽某些权限。

    下一步

    订阅更新,获取更多学习资料,请关注我们的 :