本文共 2019 字,大约阅读时间需要 6 分钟。
在 Linux 或 Unix 系统中,守护进程(Daemon)是系统运行的核心服务之一。它代表着脱离终端控制的进程,能够独立运行并配置运行级别。守护进程通常在系统引导时启动,并在系统关闭时终止。下文将详细介绍守护进程的创建方式及其实用示例。
守护进程(Daemon)是一个生存期较长的进程,通常独立于控制终端。在Linux中,任意终端上运行的进程都依附于该终端,当终端关闭时,该进程也会终止。而守护进程则可以在其独立于终端的运行过程中,继续执行任务或等待事件。
crond
(作业规划)、lqqd
(打印队列处理)等。创建子进程并让父进程退出
使用fork
函数创建子进程后,父进程可选择退出,这样可以避免用户在终端中看到父进程的运行状态。摆脱会话期和进程组控制
调用setsid
函数创建新的会话,并让该子进程成为会话组的组长。这样可以完全切断与原终端、会话期和进程组的联系。修改当前目录为根目录
使用chdir
函数将根目录设置为守护进程的工作目录,以避免运行时文件系统的不稳定性问题(如挂载点丢失)。恢复文件权限掩码
比较常见的做法是重设文件权限掩码为0
,以便子进程获得完整文件操作权限。关闭不必要的文件描述符
使用close
函数关闭输入、输出和报错文件描述符,以释放资源。以下是一个实现在 /tmp/daemon.log
中每隔10秒写入一行日志的守护进程示例代码:
#include#include #include #include #include #include #include #include #define MAXFILE 65535void sigterm_handler(int arg){ _running = 0;}int main(){ pid_t pc; int i, fd, len; char *buf = "this is a Daemon\n"; len = strlen(buf); pc = fork(); if (pc < 0) { printf("error fork\n"); exit(1); } else if (pc > 0) { exit(0); } setsid(); pid = fork(); if (pid < 0) { perror("fork error"); exit(1); } if (pid > 0) { exit(0); } chdir("/"); umask(0); for (i = 0; i < MAXFILE; i++) { if ((i == STDERR_FILENO || i == STDIN_FILENO || i == STDOUT_FILENO) && fd > 0) { close(i); } } signal(SIGTERM, sigterm_handler); _running = 1; while (_running) { if ((fd = open("/tmp/daemon.log", O_CREAT | O_WRONLY | O_APPEND, 0600)) < 0) { perror("open"); exit(1); } write(fd, buf, len); close(fd); usleep(10000); // 检查间隔时间 } return 0;}
crond
:用于定期执行计划任务,配置在 /etc/crontab
文件中。httpd
:Apache 网络服务,提供静态和动态网页内容。MeyServer
:用于处理网络文件共享和打印请求。dnsmasq
:动态 DNS 和 WWW 代理服务器。fork
创建子进程时,应注意释放不必要的资源,避免造成系统负担。signal
函数)以确保守护进程在终止时能够优雅地关闭文件描述符。/etc/syslog
或 /var/log
中的日志文件验证守护进程的运行情况。以上内容不仅保留了技术细节的准确性,还通过自然的叙述方式传达了守护进程的核心知识。
转载地址:http://osuzk.baihongyu.com/