守护进程(精灵进程)

文章目录

  • [会话 作业 进程组](#会话 作业 进程组)
  • 守护进程

会话 作业 进程组

每次我们远端登录Linux,OS会给我提供bash和一个终端,用来给我们用户提供命令行服务,这就叫做一个会话,然后我们在该终端下启动的所有进程,都是默认在当前会话中的一个进程组(一个进程也可以自成进程组)。

所以进程组一定是在一个会话中的。

任何一个时刻一个会话内部,可以存在很多个进程组(用户级任务),但是同一时刻只允许一个进程组在前台(前台进程)。

如果我们用管道同时启动多个任务的话,这些进程为一个进程组,先启动的为组长。

所以Linux的服务器中有很多个会话,每个会话可以存在很多个任务。

守护进程

守护进程是一个独立的会话,不隶属于任何一个bash的会话。而且守护进程一般不为进程组的组长,所以一般我们会先进行fork()创建子进程,然后让父进程退出,这样父进程就是组长,让子进程执行后面的代码。

这时系统中让进程变为守护进程的系统调动,可以直接调用该这个接口让自己的进程守护化。

一般进程守护化会分为5个步骤:

  1. 先忽略可能让程序崩溃的信号。
  2. 让自己不要成为组长
  3. 让自己成为一个会话
  4. 选择是否更改工作目录
  5. 选择是否关闭标准输入输出错误流

让自己成为一个独立的会话可以使用setsid

因为已经成为一个独立的会话,已经没必要和用户交互什么的了,但是代码中可能还存在打印什么的函数,所以可以把标准输入输出错误流重定向给/dev/null 这个文件是Linux中都有的一个文件,Linux会自动的把写入到这里的内容丢弃。

下面是自己实现的一个进程守护化的代码,用户可以根据需求是否更改工作目录和重定向或者关闭不需要的文件描述符。更改工作目录一般推荐更改到根目录(/)。

cpp 复制代码
#pragma once

#include <iostream>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
#include <fcntl.h>

const char* cwd = "/";
const char* dev_null = "/dev/null";

void Daemon(bool ischidir, bool isclose)
{
    // 1. 忽略可能引起进程异常退出的信号
    signal(SIGCHLD,SIG_IGN);
    signal(SIGPIPE,SIG_IGN);

    // 2.让自己不要成为组长
    if(fork() > 0) exit(0);

    // 3. 设置让自己成为一个新的会话
    setsid();

    // 4. 更改工作目录
    if(ischidir) chdir(cwd);

    // 5. 断开与标准输出等的联系
    if(isclose)
    {
        close(0);
        close(1);
        close(2);
    }else
    {
        int fd = open(dev_null,O_RDWR);
        dup2(fd,0);
        dup2(fd,1);
        dup2(fd,2);
        close(fd);
    }
}
相关推荐
hansang_IR12 分钟前
【题解】[COCI 2024/2025 #2] 流明 / Blistavost
c++·算法·动态规划·dp
IT小盘16 分钟前
17-构建Prompt测试集-提示词优化不再凭感觉
服务器·windows·prompt
不正经学生17 分钟前
C语言指针进阶:const 和野指针——给指针加锁,向野指针宣战
c语言·开发语言·c++·算法·c#
程序喵大人18 分钟前
【C++进阶】STL算法与函数对象 - 01 让算法去处理一段迭代器范围
开发语言·c++·算法·函数对象
2401_858286111 小时前
OS81.【Linux】基于环形队列的多生产者-多消费者模型
linux·运维·服务器·环形队列
U-Mail邮件系统1 小时前
企业邮箱搭建用自建还是租用?合规、成本与安全性对比解析
服务器·网络·企业邮箱系统
旖旎夜光1 小时前
LeetCode 738:单调递增的数字(贪心算法) —— 题解
数据结构·c++·算法·leetcode·贪心算法
llilian_161 小时前
基于PCI总线校时时钟同步卡的高精准授时解决方案
大数据·服务器·功能测试·单片机
旖旎夜光2 小时前
LeetCode 1262:可被三整除的最大和 (贪心算法)—— 题解
数据结构·c++·算法·leetcode·贪心算法
米修米修ne2 小时前
Home Assistant连接米家MIoT和苹果HomeKit折腾笔记
服务器·智能家居