一、什么是守护进程
守护进程(Daemon)是在操作系统中运行的一种特殊类型的后台进程。它在系统启动时启动,并在系统关闭时终止,与用户交互的终端会话无关。守护进程通常在后台运行,不会与用户进行直接的交互,也不会被用户终止。
守护进程通常用于执行一些系统级的任务和服务,比如网络服务、数据库服务、日志记录、定时任务等。它们在系统运行时一直保持活动状态,为其他应用程序或用户提供服务
二、守护进程和普通进程的区别
守护进程相对于普通进程的主要区别在于其独立于终端会话,并且在后台持续运行。守护进程通常用于以下几个方面:
后台运行:守护进程不与终端关联,不受终端关闭或用户注销的影响,可以在后台持续运行。这对于需要长时间运行或定期执行任务的应用程序非常有用。
无人值守:守护进程可以在没有用户交互的情况下执行任务,比如定期备份、日志记录、监控等。这使得应用程序可以在没有人为干预的情况下自动执行。
资源管理:守护进程可以独立于终端会话,并且可以以系统级别的权限运行。这使得守护进程可以管理系统资源,如网络服务、数据库服务等,而不受特定用户登录或注销的影响。
多任务处理:守护进程可以同时处理多个任务或请求,通过并发处理提高系统的吞吐量和响应能力。
总之,守护进程的主要意义在于提供一种后台运行、无人值守、资源管理和多任务处理的机制,使得应用程序可以在系统层面上提供持续的服务和功能。这对于服务器应用程序、网络服务、系统监控等场景非常重要。
三、创建守护进程的三种方式
- 使用nohup命令
- 使用fork()函数按步骤创建
- daemon() 函数直接创建守护进程
四、举个栗子
1、使用fork函数
要创建一个守护进程,可以按照以下步骤进行:
创建一个子进程,并使父进程退出。这可以通过调用fork()函数来实现。
在子进程中调用setsid()函数创建一个新的会话,并使子进程成为该会话的首进程。这将使子进程脱离控制终端。
关闭标准输入、标准输出和标准错误输出。可以使用close()函数关闭文件描述符,或者将它们重定向到/dev/null文件。
改变当前工作目录到一个合适的位置,以免影响其他文件系统的挂载。
重新设置文件权限掩码,以确保守护进程创建的文件具有适当的权限。
在守护进程中执行需要的操作,如处理请求、定期任务等。
下面是一个简单的示例代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
int main() {
pid_t pid = fork();
if (pid < 0) {
perror("fork error");
exit(1);
}
if (pid > 0) {
// 父进程退出
exit(0);
}
// 创建新会话
if (setsid() < 0) {
perror("setsid error");
exit(1);
}
// 关闭标准输入、标准输出和标准错误输出
close(STDIN_FILENO);
close(STDOUT_FILENO);
close(STDERR_FILENO);
// 改变当前工作目录
chdir("/");
// 重新设置文件权限掩码
umask(0);
// 在守护进程中执行需要的操作
// ...
return 0;
}
2、使用daemon函数
以下的示例中,我们调用了 daemon(0, 0) 来创建守护进程。daemon 函数的两个参数 nochdir 和 noclose 都设置为0,表示守护进程将会修改工作目录并关闭文件描述符。
如果 daemon 函数调用成功,它会使当前进程分叉出一个子进程,并使父进程退出,子进程成为守护进程。此时,守护进程将与控制终端分离,不再与用户交互。
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main() {
int result = daemon(0, 0);
if (result == -1) {
perror("Failed to create daemon process");
exit(1);
}
// 守护进程的逻辑代码
return 0;
}
3、使用nohup
nohup 是一个在 Unix 和类 Unix 系统上的命令,用于在后台运行程序,并且忽略挂起信号(SIGHUP)。它的名称是 “no hang up” 的缩写。
使用 nohup 命令可以在终端关闭或用户注销时继续运行程序,而不会受到 SIGHUP 信号的影响。这对于长时间运行的任务或后台服务很有用。
以下列举了几种nohup用法
nohup ./main.exe
nohup java -jar xxx.jar &
nohuo tail -f xx.log
nohuo tail -f xx.log &