原理
守护进程(Daemon Process)是在后台运行的一种特殊类型的进程,通常独立于控制终端并在系统启动时启动。守护进程通常用于执行特定的系统任务或服务,如定期执行维护任务、监控硬件或网络服务等。
特点:
-
脱离控制终端:守护进程通常会脱离控制终端,持续在后台运行。
-
独立于用户会话:守护进程通常在系统启动时启动,并在系统关闭时终止。它们不依赖于任何特定用户的登录状态。
-
无交互性:它们在后台默默地执行任务,不需要用户干预,只和组员交互。
-
经常用于服务:许多系统服务和后台任务都是通过守护进程来实现的,eg: adb、docker容器、sshd
创建步骤
-
创建子进程并结束父进程:首先,通过fork()系统调用创建一个子进程,然后使父进程退出,变成孤儿进程被init收养
-
调用setsid()函数:子进程调用setsid()函数创建一个新的会话,并成为会话首进程和进程组的组长。这样可以确保守护进程不会受到终端会话的影响。
-
改变当前工作目录:为了避免影响其他进程,守护进程一般会将当前工作目录切换到根目录或其他安全目录。
-
关闭文件描述符:守护进程一般会关闭标准输入、标准输出和标准错误输出,避免对终端的依赖。这可以通过关闭文件描述符0、1和2来实现。
-
处理信号:守护进程需要处理一些系统信号,例如SIGHUP,以确保它能够正确地响应系统信号并保持稳定运行。
-
执行守护进程的主要任务:最后,守护进程会执行其主要任务,通常是在后台默默地执行某些系统任务或服务。
通过以上步骤,守护进程就能够在系统中独立运行,并提供所需的服务或功能,而不会受到用户登录状态或终端会话的影响。创建守护进程需要小心处理细节,确保它能够稳定运行并正确地执行其任务。