守护进程
Linux Daemon(守护进程)是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行
某种任务或等待处理某些发生的事件。它不需要用户输入就能运行而且提供某种服务,不是对整个
系统就是对某个用户程序提供服务。Linux系统的大多数服务器就是通过守护进程实现的。常见的
守护进程包括系统日志进程syslogd、 web服务器httpd、邮件服务器sendmail和数据库服务器
mysqld等。守护进程的名称通常以d结尾
特点:
1、生存周期长(非必须),一般操作系统启动的时候就启动,关闭的时候就关闭。
2、守护进程和终端无关联,也就是他们没有控制终端,所以当控制终端退出,也不会导致守护进程退出。
3、守护进程是在后台运行,不会占着终端,终端可以执行其他命令
4、一个守护进程的父进程是init进程,因为它真正的父进程在fork创建子进程后就先于子进程exit退出,所以他是由init继承的孤儿进程。
linux操作系统本身是有很多的守护进程在默默执行,维持着系统的日常活动,大概30-50个。
用 ps -elf 指令列举出所有进程
unix标准风格组合,其中-e 代表列出所有进程,-l 代表长格式,-f 代表完整的格式
ppid = 0:内核进程,跟随系统启动而启动,生命周期贯穿整个系统。
cmd列名带[]这种,叫内核守护进程
老祖init:也是系统守护进程,它负责启动各运行层次特定的系统服务;所以很多进程的PPID是init,也负责收养孤儿进程。
TIME CMD列中名字不带[]的普通守护进程(用户集守护进程)
守护进程的开发:
damon()函数
#include <unistd.h>
int daemon(int nochdir,int noclose)
参数说明:
nochdir:如果这个参数非零,则不改变当前工作目录至“/”。如果为零,则将当前工作目录更改为“/”。
noclose:如果这个参数非零,则不关闭文件描述符0、1、2。这通常意味着不将标准输入、标准输出和标准错误重定向到/dev/null。如果为零,则重定向这些文件描述符到/dev/null。
daemon()函数成功时返回0,失败时返回-1并设置errno。
eg:使用daemon()函数创建守护进程,并每隔一定时间将当前时间记录到日志文件的简单示例
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <time.h>
void log_time(const char *logfile) {
time_t rawtime;
char time_string[80];
FILE *fp;
time(&rawtime);
strftime(time_string, sizeof(time_string), "%Y-%m-%d %H:%M:%S", localtime(&rawtime));
fp = fopen(logfile, "a");
if (fp != NULL) {
fprintf(fp, "%s\n", time_string);
fclose(fp);
} else {
perror("Error opening log file");
exit(EXIT_FAILURE);
}
}
int main() {
const char *logfile = "/var/log/daemon.log";
int interval = 10; // Log time every 10 seconds
// Create the daemon
if (daemon(0, 0) == -1) {
perror("daemon");
exit(EXIT_FAILURE);
}
// Open the log file with appropriate permissions
umask(0);
FILE *log_fp = fopen(logfile, "a");
if (log_fp == NULL) {
perror("Error opening log file");
exit(EXIT_FAILURE);
}
fclose(log_fp);
// Main loop to log time
while (1) {
log_time(logfile);
sleep(interval);
}
return 0;
}
可把执行文件放到开机自启动上
sudo vi /etc/rc.local
守护进程和后台进程的区别:
1、守护进程和终端不挂钩,后台进程能往终端上输出东西(和终端挂钩)
2、守护进程关闭终端时不受影响,守护进程不会随着终端的退出而退出