当前位置: 首页 > article >正文

linux创建守护进程

linux创建守护进程


Linux守护进程是一种在后台运行的进程,通常用于服务程序,如Web服务器、数据库服务器等。下面是创建Linux守护进程的步骤:

创建子进程并退出父进程
在子进程中创建新会话,使子进程成为会话首进程
改变工作目录为根目录
重设文件掩码
关闭或者重定向不需要的文件描述符(0,1,2)
处理SIGCHLD信号
执行守护进程的核心逻辑
下面是一个示例程序:


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

void daemonize() {
    pid_t pid = fork();    // 创建子进程
    if (pid < 0) {
        perror("fork");
        exit(EXIT_FAILURE);
    }
    if (pid > 0) {    // 父进程退出
        exit(EXIT_SUCCESS);
    }
    umask(0);    // 重设文件掩码
    if (setsid() < 0) {    // 创建新会话
        perror("setsid");
        exit(EXIT_FAILURE);
    }
    if (chdir("/") < 0) {    // 改变工作目录为根目录
        perror("chdir");
        exit(EXIT_FAILURE);
    }
    close(STDIN_FILENO);    // 关闭不需要的文件描述符
    close(STDOUT_FILENO);
    close(STDERR_FILENO);
    signal(SIGCHLD, SIG_IGN);    // 处理SIGCHLD信号
}

int main() {
    daemonize();    // 创建守护进程
    while (1) {    // 守护进程核心逻辑
        sleep(1);
    }
    return 0;
}

上面的程序中,daemonize函数是创建守护进程的关键。它先创建子进程,然后在子进程中创建新会话、重设文件掩码、改变工作目录为根目录、关闭不需要的文件描述符和处理SIGCHLD信号。最后,它返回到main函数中执行守护进程的核心逻辑。

这个例子中的守护进程的应用场景可能是一个后台服务程序,如文件传输服务、数据采集服务等。当这些服务需要长期运行时,可以将它们设计成守护进程。在日常使用中,我们也可以使用一些类似于systemd、upstart等工具来管理守护进程,方便管理和启动守护进程。

守护进程的原理是通过创建新的会话和进程组,与原来的控制终端脱离关系,使得守护进程不会被终端信号所影响。同时,守护进程需要关闭不需要的文件描述符,避免因为文件描述符未关闭而导致系统资源


http://www.kler.cn/a/5116.html

相关文章:

  • Dart语言的语法糖
  • 设计模式 行为型 责任链模式(Chain of Responsibility Pattern)与 常见技术框架应用 解析
  • uniapp实现在card卡片组件内为图片添加长按保存、识别二维码等功能
  • IP 地址与蜜罐技术
  • 在Jmeter中跨线程组传递变量(token)--设置全局变量
  • web作业
  • Mybatis(一)-------
  • shell 脚本之一键部署安装 Nginx
  • 并查集和哈希表的实现
  • 【Python】线程
  • java企业级信息系统开发学习笔记02初探spring——利用组件注解符精简spring配置文件
  • 第14章_MySQL事务日志
  • 2009年9月Java全国计算机等级考试二级笔试试卷
  • 可用的公开 RTSP/ RTMP 在线视频流资源地址(亲测可行)
  • python去掉字符串中的指定字符的方法
  • 《代码实例》Vue组件与路由
  • 蓝桥杯刷题冲刺 | 倒计时9天
  • 企业安全现状与未来趋势如何?
  • 软件测试方法下篇(正交法、场景设计法、错误猜测法)
  • Go工程基础知识
  • 论文阅读 | End-to-End Learning of Representations for Asynchronous Event-Based Data
  • Python轻量级Web框架Flask(2)——Flask模板渲染/Flask项目拆分
  • Intel Pin常用基础函数
  • Java设计模式-7、装饰器模式
  • 【华为OD机试真题JAVA】两个数和两数之和绝对值问题
  • BO OLAP 连接 HANA 先决条件