Linux的守护进程

时间:2024-03-22 19:16:43

守护进程

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:如果这个参数非零,则不关闭文件描述符012。这通常意味着不将标准输入、标准输出和标准错误重定向到/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、守护进程关闭终端时不受影响,守护进程不会随着终端的退出而退出