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

Linux系统编程守护进程(36)

文章目录

  • 前言
  • 一、进程组
  • 二、会话
    • 什么是会话
    • 如何创建会话
    • 会话ID
  • 三、作业控制
    • 作业与作业控制
    • 作业号
  • 四、守护进程
  • 五、怎么变成守护进程
  • 总结


前言

  嘿,又回来更新喽!


一、进程组

  每个进程除了有进程 ID(PID)之外,还属于一个 进程组 。进程组是一个或多个进程的集合,一个进程组可以包含多个进程,每个进程组也有一个唯一的进程组 ID(PGID),类似于进程 ID

在这里插入图片描述

  每个进程组都有一个组长进程。组长进程的 ID 等于其进程 ID,进程组组长可以创建一个进程组或者创建该组中的进程

  进程组的生命周期:从进程组创建开始到其中最后一个进程离开为止,只要进程组中有一个进程存在,则该进程组就存在,这与组长进程是否终止无关

二、会话

什么是会话

  会话可以看作是一个或多个进程组的集合,一个会话可以包含多个进程组,每个会话也有一个会话 ID(SID)

在这里插入图片描述
  你注意看上图,可以看到三个sleep进程的PGID是一样的,那自然而然 SID 肯定也是一样的

  创建一个会话,一般会形成一个终端文件,然后关联一个 bash 进程,bash 进程单独一个进程组,会话 ID 一般是会话中第一个进程 的 ID,一般是 bash 进程 ID

  同一个会话中,可以同时存在多个进程组,但是,任何时刻只允许一个前台进程(组)运行,可以允许多个进程(组)后台运行

在这里插入图片描述
在这里插入图片描述

如何创建会话

  可以调用 setsid 函数,前提是调用进程不能是一个进程组的组长

#include <unistd.h>pid_t setsid(void);
  • 返回值:创建成功返回SID, 失败返回-1

该接⼝调⽤之后会发⽣:

  • 调⽤进程会变成新会话的会话⾸进程。此时,新会话中只有唯⼀的⼀个进程
  • 调⽤进程会变成进程组组⻓。新进程组 ID 就是当前调⽤进程 ID
  • 该进程没有控制终端。如果在调⽤ setsid 之前该进程存在控制终端,则调⽤之后会切断联系
  • 需要注意的是:这个接⼝如果调⽤进程原来是进程组组⻓,则会报错,为了避免这种情况,我们通常的使用方法是先调⽤ fork 创建子进程,父进程终⽌,子进程继续执行,因为⼦进程会继承⽗进程的进程组 ID ,⽽进程 ID 则是新分配的,就不会出现错误的情况。

会话ID

  会话首进程的进程 ID 就是会话 ID,会话首进程一般是 bash 进程,bash 进程组中就一个 bash 进程

三、作业控制

作业与作业控制

  作业是针对用户来讲,用户完成某项任务而启动的进程,一个作业既可以只包含一个进程,也可以包含多个进程,进程之间相互协作完成任务

  shell 分前后台来控制的不是进程而是作业或进程组。一个前台作业可以有多个进程组成,shell 可以同时运行一个前台作业和任意多个后台作业,这被称为作业控制

作业号

  放在后台执行的程序或命令称为后台命令,可以在命令的后面加上 & 符号从而让 shell 识别到这是一个后台命令,后台命令不用等待该命令执行完成,就可立即接受新的命令,另外后台进程执行完后会返回一个作业号以及一个进程号

在这里插入图片描述

  可以看到作业号是 1,进程 ID 是 1045873

在这里插入图片描述

四、守护进程

  守护进程(Daemon)是一类在后台运行的特殊进程,它们通常在系统启动时启动,并在系统运行期间提供各种服务,或者等待执行特定任务

  • 后台运行:守护进程在后台运行,不与任何控制终端直接关联,它们独立于用户直接交互
  • 长时间运行:守护进程通常在整个系统运行期间持续运行,或者至少在需要时保持活动状态
  • 服务提供者:守护进程提供系统或网络服务,例如Web服务器、数据库服务器、邮件服务器等
  • 监听请求:守护进程通常监听特定的端口或系统事件,等待客户端的请求或系统的通知
  • 无用户交互:守护进程不提供直接的用户交互界面,它们通过程序接口与系统或其他进程通信
  • 自动重启:在某些系统中,如果守护进程崩溃或被终止,系统可能会自动重启它们,以确保服务的连续性
  • 系统管理:守护进程可以用于执行系统管理任务,如日志记录、资源监控、定时任务等
  • 权限:守护进程通常以特定的用户身份运行(如 root 或其他系统用户),以执行需要特定权限的操作
  • 进程特性:在 Unix-like 系统中,守护进程可以通过修改进程的 umask 值、关闭文件描述符、创建新的会话和进程组等操作来设置自己的运行环境
  • 日志记录:守护进程通常会将运行状态和错误信息记录到日志文件中,以便系统管理员监控和调试

在这里插入图片描述

五、怎么变成守护进程

#pragma once#include <iostream>
#include <string>
#include <unistd.h>
#include <cstdlib>
#include <signal.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>const std::string defaultpath = "/";
const std::string defaultdev = "/dev/null";void Daemon(bool ischdir, bool isclose)
{// 1.忽略不必要的信号signal(SIGCHLD, SIG_IGN);signal(SIGPIPE, SIG_IGN);// 2.forkif (fork() > 0) exit(0);// 3.setsidsetsid();// 4.确认是否要更改工作目录if (ischdir)chdir(defaultpath.c_str());// 5.对012进行重定向if (isclose){::close(0);::close(1);::close(2);}else{// 读写都打开int fd = open(defaultdev.c_str(), O_RDWR);if (fd > 0){dup2(fd, 0);dup2(fd, 1);dup2(fd, 2);::close(fd);}}
}

在这里插入图片描述
  所以我们在运行网络服务器的时候,就可以把该进程变成守护进程

int main(int argc, char *argv[])
{if (argc != 2){std::cout << "Usage : " << argv[0] << " port" << std::endl;return 0;}uint16_t localport = std::stoi(argv[1]);Daemon(false, false);std::unique_ptr<TcpServer> svr(new TcpServer(localport, HandlerRequest));svr->Loop();return 0;
}

  或者其实直接使用库函数也行 daemon,以下还是咨询 DeepSeek 给出的答案

在这里插入图片描述


总结

  结束了,本篇内容是我在学习网络这一块知识的时候观察到的概念,当时就好奇搜索了一下,于是就有了本篇的的展开,也算是一个还算重要的知识点吧!


文章转载自:

http://BMJaM195.bsrqy.cn
http://wHCVi4hl.bsrqy.cn
http://3b8bYN1s.bsrqy.cn
http://YUpifviH.bsrqy.cn
http://gsjnCvMi.bsrqy.cn
http://wULrc1sH.bsrqy.cn
http://hxOI28En.bsrqy.cn
http://xrBFNMjp.bsrqy.cn
http://BijQhlQx.bsrqy.cn
http://y1CpCMdU.bsrqy.cn
http://6GJ81vVL.bsrqy.cn
http://1SVHUfKz.bsrqy.cn
http://4yZbXmjD.bsrqy.cn
http://crj6hgaa.bsrqy.cn
http://pdvyzpEO.bsrqy.cn
http://hEgvQmyX.bsrqy.cn
http://HoJ2D2Jx.bsrqy.cn
http://2oFo07TC.bsrqy.cn
http://8cWlMjMp.bsrqy.cn
http://x4KE2pSJ.bsrqy.cn
http://xbPcjjYS.bsrqy.cn
http://38DP1c3T.bsrqy.cn
http://FiI7UA2O.bsrqy.cn
http://cIwcOYsV.bsrqy.cn
http://LHCQOqu3.bsrqy.cn
http://2TmNtuYr.bsrqy.cn
http://5qQxIDsw.bsrqy.cn
http://hVe8psMb.bsrqy.cn
http://3gEJKkzy.bsrqy.cn
http://SR0WB8hM.bsrqy.cn
http://www.dtcms.com/a/370059.html

相关文章:

  • 基于STM32单片机的酒驾检测设计
  • CodeBuddy 辅助重构:去掉 800 行 if-else 的状态机改造
  • Paimon——官网阅读:文件系统
  • 数据仓库概要
  • 【C++上岸】C++常见面试题目--算法篇(第二十期)
  • PyTorch生成式人工智能——深度分层变分自编码器(NVAE)详解与实现
  • Whismer-你的定制化AI问答助手
  • Paimon——官网阅读:配置
  • FPGA会用到UVM吗?
  • 电脑外接显示屏字体和图标过大
  • 深入浅出 HarmonyOS ArkUI 3.0:基于声明式开发范式与高级状态管理构建高性能应用
  • 如何在路由器上配置DHCP服务器?
  • 计算机网络:网络设备在OSI七层模型中的工作层次和传输协议
  • Unity 如何使用ModbusTCP 和PLC通讯
  • Ribbon和LoadBalance-负载均衡
  • 性能监控shell脚本编写
  • 基于SpringBoot和uni-app开发的陪诊陪护软件系统源码
  • 记一次uniapp+nutui-uniapp搭建项目
  • 计算机网络:物理层---物理层的基本概念
  • 【Java】抽象类和接口对比+详解
  • 校园管理系统|基于SpringBoot和Vue的校园管理系统(源码+数据库+文档)
  • LeetCode5最长回文子串
  • Coze源码分析-资源库-编辑提示词-前端源码
  • 《sklearn机器学习——聚类性能指标》Contingency Matrix(列联表)详解
  • 小米笔记本电脑重装C盘教程
  • Linux RCU (Read-Copy-Update) 机制深度分析
  • 贪心算法应用:柔性制造系统(FMS)刀具分配问题详解
  • WSL Ubuntu Docker 代理自动配置教程
  • 基于Scikit-learn集成学习模型的情感分析研究与实现
  • MySQL数据库精研之旅第十七期:深度拆解事务核心(下)