首页 > 系统相关 >守护进程

守护进程

时间:2024-04-04 20:11:09浏览次数:25  
标签:log exit file 进程 include 守护

守护进程也称Daemon(精灵)进程,是Linux中的后台服务进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。一般采用以d结尾的名字。如httpd,nfsd、sshd等   Linux后台的一些系统服务进程,没有控制终端,不能直接和用户交互。不受用户登录、注销的影响,一直在运行着,它们都是守护进程。如:预读入缓输出机制的实现;ftp服务器;nfs服务器等   创建守护进程,最关键的一步是调用setsid函数创建出来一个新的session,并成为session leader   创建守护进程模型: 1、创建子进程,父进程退出 所有工作在子进程中进行形式上脱离了控制终端   2、在子进程中创建会话 setsid()函数 使子进程完全独立出来,脱离控制   3、改变当前目录位置 chdir()函数 防止占用可卸载的文件系统 也可以换成其他路径   4、重设文件权限掩码 umask()函数 防止继承的文件创建屏蔽字拒绝某些权限 增加守护进程灵活性   5、关闭/重定向文件描述符 继承的打开文件不会用到,浪费系统资源,无法卸载   6、开始执行守护进程核心工作守护进程退出处理程序模型,while()  

守护进程demo:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <time.h>

void daemonize() {
    pid_t pid;

    // 创建子进程,并结束父进程
    pid = fork();
    if (pid < 0) {
        perror("fork");
        exit(EXIT_FAILURE);
    }
    if (pid > 0) {
        exit(EXIT_SUCCESS);
    }

    // 创建新会话
    if (setsid() < 0) {
        perror("setsid");
        exit(EXIT_FAILURE);
    }

    // 修改当前工作目录
    if (chdir("/") < 0) {
        perror("chdir");
        exit(EXIT_FAILURE);
    }

    // 设置umask
    umask(0);

    // 关闭标准输入、输出、错误流,并重定向到/dev/null
    close(STDIN_FILENO);
    close(STDOUT_FILENO);
    close(STDERR_FILENO);
    open("/dev/null", O_RDWR); // stdin
    dup2(0, STDOUT_FILENO);     // stdout
    dup2(0, STDERR_FILENO);     // stderr
}

void main_loop() {
    FILE *log_file;
    time_t current_time;

    // 打开日志文件
    log_file = fopen("/tmp/daemon.log", "a+");
    if (log_file == NULL) {
        perror("fopen");
        exit(EXIT_FAILURE);
    }

    // 每隔一段时间向日志文件中写入消息
    while (1) {
        time(&current_time);
        fprintf(log_file, "Daemon is running... %s", ctime(&current_time));
        fflush(log_file);
        sleep(10); // 10秒
    }

    fclose(log_file);
}

int main() {
    // 创建守护进程
    daemonize();

    // 进入主循环
    main_loop();

    return 0;
}
  执行结果: 0 daemon守护进程会在后台运行,可以在/tmp/daemon.log中获取到相应的log信息: 0          

标签:log,exit,file,进程,include,守护
From: https://www.cnblogs.com/lethe1203/p/18114547

相关文章

  • 操作系统综合题之“短进程优先调度算法(Shortest-Process-First,SPF)和非抢占式优先权调
    一、问题:1.当系统采用短进程优先调度算法时,试写出进程的执行顺序,并计算各个进程的周转时间以及平均周转时间2.当系统采用优先权调度算法时,试写出进程的执行顺序,并计算各个进程的周转时间以及平均周转时间  二、参考答案上面是短进程优先调度算法下面是优先权调度算法 ......
  • 操作系统综合题之“短进程优先调度算法(Shortest-Process-First,SPF)和非抢占式优先权调
    一、问题:有5个进程A、B、C、D、E,他们的到达时间分别为0,10,20,30,35ms,预计他们的运行时间分别为100、60、20、40、80ms。其优先数分别为3、1、4、5、2(优先级数值越小,表示优先级越高)。要求1.分别给出采用短进程优先调度算法、非抢占式优先权调度算法时,进程的启动顺序2.分别计算上......
  • 操作系统综合题之“采用时间片轮转调度算法(Round-Robin,RR)执行,分时系统中的进程可能出
    一、问题:某分时系统中的进程可能出现下图所示的状态变化,请回答下列问题:1.根据图示,您认为该系统采用的是什么进程调度策略?2.把图中所示的每一个状态变化的原因填在下表相应位置。变化原因1 2 3 4 5 6 二、参考答案答:1.时间片轮转调度......
  • 在Linux中,如何查看和结束正在运行的进程?
    在Linux中,查看和结束正在运行的进程通常涉及到几个基础的命令行工具。以下是一些常用的方法:1.查看正在运行的进程:1.ps命令基本用法:ps可以显示当前终端会话的进程列表。ps显示所有进程:ps-e或ps-A显示系统中所有的进程。ps-e包含父进程ID(PPID)和进程树......
  • 在Linux中,进程和线程有何作用?
    在Linux操作系统中,进程和线程都扮演着关键角色,它们的设计目的是为了支持系统的并发性和资源共享,以及提高应用程序的性能和响应能力。进程的作用:资源隔离:进程是操作系统分配资源的基本单位,每个进程都有自己独立的地址空间,包括代码段、数据段、堆和栈,这样可以防止一个进程错误......
  • 操作系统综合题之“采用时间片轮转调度算法(Round-Robin,RR)执行5个进程,P1进程周转时间
    一、问题:系统中有5个进程P1、P2、P3、P4、P5,它们的到达时间和服务时间如题9表所示。忽略I/O以及其他开销时间,若采用时间片轮转调度算法(时间片为1),则P1的周转时间为多少? 二、参考答案完整执行线p1,p2,p3,p4 ,p1,p2,p3,p4,p5,  p1,p3,p4,p5, p1,p3因为最后一次p1执行完......
  • Linux进程创建和管理
    在Linux中,进程创建和管理的相关函数主要是fork()、exec()、wait()和exit() 举个例子:#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<sys/wait.h>intmain(){pid_tpid;//创建子进程pid=fork();if(pid<0){......
  • 进程间通信(4)-信号量
    Linux中的信号量通常指的是进程间通信(IPC)中的一种机制,用于实现进程之间的同步和互斥。在Linux中,主要有两种类型的信号量:SystemV信号量和POSIX信号量。1.SystemV信号量SystemV信号量是最早引入Linux的一种进程间通信机制,它使用semget、semctl和semop等函数进行......
  • nodejs守护进程 PM2
    nodejs守护进程PM2 概述PM2是用于Node.js应用程序的生产环境进程管理器,内置负载均衡器。它允许你将应用程序持续运行,无需停机重新加载,并简化常见的系统管理任务。官方网站 Github特性进程管理:PM2可以启动、停止和重启Node.js应用程序进程,确保应用程序一直处于运行......
  • setrlimit函数限制进程资源
    setrlimit设置参数满足structrlimit{rlim_trlim_cur;//软限制rlim_trlim_max;//硬限制}可以设置的参数:RLIMIT_AS:进程总的可用的存储空间的大小。此外,自动堆栈扩展也将失败(并生成一个SIGSEGV,当没有备用堆栈可用时,它会终止进程)RLIMIT_CORE:核心文件的最大......