Linux守护进程

什么是守护进程

守护进程独立于控制终端,通常周期性地执行某种任务或等待处理某些事件。守护进程的特点使它们非常适合作为服务器上的服务进程,处理如邮件传输、打印服务、文件传输等任务。

守护进程的特点

后台运行:守护进程在后台执行,不会占用用户的终端或交互界面。

长期运行:它们从系统启动时开始运行,直到系统关闭,除非被明确停止。

没有控制终端:守护进程通常不会打开控制终端,它们不会与用户直接交互。

在新会话中启动:守护进程通常会启动一个新的会话,并成为该会话的首进程,从而与启动它们的终端和用户会话脱离关系。

处理系统级任务:守护进程通常用于执行系统级任务,如日志文件的维护、任务调度等。

如何创建守护进程

创建子进程,退出父进程 :这样可以保证该进程不是进程组的首进程,允许它调用setsid创建新会话。因为POSIX标准规定,setsid()调用失败如果调用进程已是进程组的领导。这是为了防止进程组领导重新获取控制终端,这与守护进程的独立性质相违背。

创建新的会话 :调用setsid创建一个新的会话,使进程成为会话首进程,脱离原有控制终端。

改变当前目录:将当前工作目录更改为根目录,以避免守护进程阻止卸载文件系统。因为在运行期间,一个进程可能会打开和操作其当前工作目录下的文件,如果这个目录被删除或移动,可能会导致一些意想不到的错误。将工作目录更改为根目录可以防止这种情况的发生,因为根目录是系统中不可删除的核心部分。

重设文件权限掩码 :调用umask设置一个适当的文件创建权限掩码,通常是0。因为要确保守护进程创建的文件具有最大的权限

关闭文件描述符:关闭继承自父进程的所有文件描述符,包括标准输入、标准输出和标准错误。因为守护进程不与外界打交道,所以这些文件描述符也将没有意义。为了节省系统资源所以关闭(它的文件描述符是通过父类继承下来的)。

处理标准输入、输出和错误 :通常会将这些重定向到/dev/null。因为守护进程通常不会与用户交互,也不需要在终端上输出信息。将标准输出和标准错误重定向到/dev/null可以将所有输出静默化,从而避免在不需要时输出到终端上。如果守护进程尝试从标准输入读取数据,而标准输入没有输入,它可能会被阻塞等待输入。将标准输入重定向到/dev/null可以确保即使有输入尝试读取,也会立即返回文件结束(EOF),避免进程阻塞。

示例代码:

cpp 复制代码
#include<iostream>
#include<unistd.h>
#include<assert.h>
#include <fcntl.h>
using namespace std;
int main()
{
    pid_t pid = fork();
    assert(pid!=-1);
    if(pid>0) // 父进程
    {
        exit(0);
    }
    else // 子进程
    {
        //1
        setsid();
        //2
        chdir("/");
        //3
        umask(0);
        //4
        for (int fd = 3; fd < 1024; fd++) 
        close(fd);
        //5
        int devNull = open("/dev/null", O_RDWR);
        if (devNull == -1) 
        {
            perror("open /dev/null");
            exit(EXIT_FAILURE);
        }
        if (dup2(devNull, 0) == -1 || dup2(devNull, 1) == -1 || dup2(devNull, 2) == -1) 
        {
            perror("dup2");
            exit(EXIT_FAILURE);
        }
        close(devNull);
    }
}
相关推荐
byte轻骑兵几秒前
【BlueZ 】util 模块:通用工具函数,源码中高频复用的基础组件
linux·人工智能·bluez·电脑蓝牙·嵌入式蓝牙
M78佐菲5 分钟前
51单片机学习笔记(2)
linux·笔记·嵌入式硬件·学习·51单片机
C++ 老炮儿的技术栈10 分钟前
西门子 S7 常用存储区(I/Q/M/T/C/DB/PI/PQ)
linux·开发语言·c++·windows·qt·io
云飞云共享云桌面16 分钟前
不用批量采购工作站|液压设备制造,SolidWorks 多人共享服务器方案
运维·服务器·网络·数据库·制造
T1mzhou19 分钟前
ARM64 Linux 6.10 内核驱动(13):bus.c / driver.c 总线两张表,驱动怎么挂上去
linux·服务器·c语言·arm开发·arm
六点_dn22 分钟前
线上踩坑:Binlog重放,线上服务未停止导致主键冲突
linux·运维·服务器
持敬chijing23 分钟前
CentOS 从零搭建 LAMP 环境完整实战指南
linux·运维·web安全·网络安全·centos
赋创小助手24 分钟前
多GPU服务器交付验收:GPU健康、P2P、NCCL与稳定性测试思路
运维·服务器·人工智能·ai·部署·gpu·p2p
xiaoye-duck28 分钟前
《Linux 网络编程》深入理解 TCP 协议(三):TCP 报头六大标志位详解
linux·网络·tcp
Android系统攻城狮37 分钟前
Linux Gstreamer深度解析之gst_audio_channel_positions_to_mask调用流程与实战(十七)
linux·运维·服务器·gstreamer音视频·音视频进阶