Linux--守护进程与会话

进程组

概念

进程组就是一个或多个进程的集合
一个进程组可以包含多个进程。

下面我们通过一句简单的命令行来展示:
在这里插入图片描述

为什么会有进程组?

  • 批量操作:进程组允许将多个进程组织在一起,形成一个逻辑上的整体。当需要对多个进程执行相同的操作时,可以通过进程组进行操作实现,不用对每一个进程执行相同的操作,这样大大提高执行效率。
  • 任务控制:在Linux操作系统中,进程组与作业控制紧密联系。用户可以通过作业控制指令来管理进程组中的进程,从而实现任务的启动、暂停、恢复、停止等功能。
  • 功能联系:进程组中的进程通常在功能上都有相近的联系,它们协同工作完成特定任务。通过进程组可以快速的管理和这些具有共同目标的进程。

如果只有一个进程,是否有进程组?

在这里插入图片描述

组长进程

每一个进程组都有一个组长进程,这个进程的PID与进程组ID一样

  • 作用:进程组组长可以创建一个进程组
  • 生命周期:从进程组创建存在到其中一个最后进程离开为止。

会话

概念

由多个进程组组成的集合,称为会话(session ID)
它提供了一个运行环境和资源共享的上下文,包含了一组相关的进程,这些进程具有共同的会话标识符(SID)。
像我们通过Xshell打开的一个会话页面,就是一个会话。

我们可以通过命令查看已打开的会话:

ls /dev/pts/ 

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

setsid()

setsid() 函数在 Unix 和类 Unix 系统中用于创建一个新的会话(session),并使调用该函数的进程成为新会话的领头进程(session leader)。这通常与创建守护进程(daemon processes)相关,因为守护进程需要独立于任何控制终端运行。

但setsid()被执行时:

  • 创建新的会话:如果调用 setsid() 的进程不是进程组的领头进程,则该函数会创建一个新的会话,并使调用进程成为该会话的领头进程。新会话的会话ID(SID)是该进程的PID。
  • 使调用进程脱离控制终端:如果调用 setsid() 的进程之前有一个控制终端,那么调用之后,该进程将不再具有控制终端。这意味着该进程不再是任何终端进程组的成员,也不再与任何终端相关联。
  • 使调用进程成为新进程组的领头进程:调用 setsid() 会导致调用进程成为一个新进程组的领头进程,该进程组的ID也是该进程的PID。

注意
如果这个进程是进程组的组长,那么将会创建会话失败;为了避免这种情况,可以在子进程里面执行该语句,同时让父进程终止;这样子进程会形成一个孤儿进程,进程ID一定是新分配的,就不会出现错误的情况了。

作业控制

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

Shell 分前后台来控制的不是进程而是作业 或者进程组。一个前台作业可以由多个进程组成,一个后台作业也可以由多个进程组成,Shell 可以同时运⾏一个前台作业和任意多个后台作业,这称为作业控制

例如:
在这里插入图片描述
在这里插入图片描述

守护进程

在一个会话中,会有一个进程是用来创建对应的会话,这个进程与会话对应的,这个进程被称为守护进程
守护进程(Daemon Process)或称为服务进程,是在Unix、Linux及类Unix操作系统中运行的一种特殊类型的后台进程。守护进程独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。守护进程通常在系统启动时由系统初始化脚本启动,并在系统关闭时关闭。它们没有控制终端,因此它们不能接收来自终端的输入,也不能在终端上显示输出。

主要特点

  • 在后台运行:守护进程在后台运行,不占用任何终端。
  • 独立于终端:守护进程与启动它的终端无关,即使启动它的终端被关闭,守护进程仍然运行。
  • 周期性地执行某些任务:守护进程可以定期执行特定的任务,如检查系统状态、备份数据等。
  • 响应系统事件:守护进程也可以监听系统事件,并在事件发生时执行相应的操作。

代码演示如何创建一个会话

Deamon.hpp

#pragma once#include <iostream>
#include <cstdlib>
#include <signal.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>const char *root = "/";             // 路径
const char *dev_null = "/dev/null"; // 重定向到哪里void Deamon(bool ischdir, bool isclose)
{// 1. 忽略可能引起程序异常退出的信号signal(SIGCHLD, SIG_IGN); // 忽略到子进程创建的信号signal(SIGPIPE, SIG_IGN); // 忽略到管道信号// 2.创建子进程,关闭父进程if (fork() > 0)exit(0);// 设置让自己成为一个新的会话, 后面的代码其实是子进程在走setsid();// 是否改变会话路径if (ischdir)chdir(root);//成为守护进程,将对应的标准流进行关闭,表示到后台运行了if (isclose){close(0);close(1);close(2);}else//这里表示重新向到指定目录下{// 这里一般建议就用这种int fd = open(dev_null, O_RDWR);if (fd > 0){dup2(fd, 0);dup2(fd, 1);dup2(fd, 2);close(fd);}}
}

main.cc

#include "Deamon.hpp"int main()
{Deamon(true,false);while(true){sleep(1);}return 0;
}

在这里插入图片描述

将服务器守护进程化

链接:Socket编程TCP

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/54227.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

下载Kafka 3.0.0教程

1、Kafka 3.0.0下载地址 Apache Kafka 2、往下拉&#xff0c;查找3.0.0版本点击下载

【C++前后缀分解 降维】2906. 构造乘积矩阵|2074

前后缀分解 C前后缀分解 LeetCode2906. 构造乘积矩阵 给你一个下标从 0 开始、大小为 n * m 的二维整数矩阵 grid &#xff0c;定义一个下标从 0 开始、大小为 n * m 的的二维矩阵 p。如果满足以下条件&#xff0c;则称 p 为 grid 的 乘积矩阵 &#xff1a; 对于每个元素 p[…

数据结构之‘栈’

文章目录 1.简介2. 栈的初始化和销毁3. 进栈和出栈3.1 进栈3.2 出栈3.3 栈的打印 1.简介 一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行&#xff08;数据插入和删除操作&#xff09;的一端称为栈顶&#xff0c;另一端称为栈底。压栈&#xf…

C语言之预处理详解(完结撒花)

目录 前言 一、预定义符号 二、#define 定义常量 三、#define定义宏 四、宏与函数的对比 五、#和## 运算符 六、命名约定 七、#undef 八、条件编译 九、头文件的包含 总结 前言 本文为我的C语言系列的最后一篇文章&#xff0c;主要讲述了#define定义和宏、#和##运算符、各种条件…

W25QXX系列Flash存储器模块驱动代码

目录 W25QXX简介 硬件电路 W25Q128框图 Flash操作注意事项 驱动代码 W25QXX.h W25QXX.c W25QXX简介 W25Qxx系列是一种低成本、小型化、使用简单的非易失性存储器&#xff0c;常应用于数据存储、字库存储、固件程序存储等场景 存储介质&#xff1a;Nor Flash&#xff0…

算法入门-贪心1

第八部分&#xff1a;贪心 409.最长回文串&#xff08;简单&#xff09; 给定一个包含大写字母和小写字母的字符串 s &#xff0c;返回通过这些字母构造成的最长的回文串 的长度。 在构造过程中&#xff0c;请注意 区分大小写 。比如 "Aa" 不能当做一个回文字符串…

如何通过 PhantomJS 模拟用户行为抓取动态网页内容

引言 随着网页技术的不断进步&#xff0c;JavaScript 动态加载内容已成为网站设计的新常态&#xff0c;这对传统的静态网页抓取方法提出了挑战。为了应对这一挑战&#xff0c;PhantomJS 作为一个无头浏览器&#xff0c;能够模拟用户行为并执行 JavaScript&#xff0c;成为了获…

Android RecycleView 深度解析与面试题梳理

本文首发于公众号“AntDream”&#xff0c;欢迎微信搜索“AntDream”或扫描文章底部二维码关注&#xff0c;和我一起每天进步一点点 引言 在 Android 开发中&#xff0c;列表和网格布局是非常常见的界面元素&#xff0c;它们用于展示大量数据集合。RecyclerView 是 Android 提…

小众语言ruby在苹果中的初步应用

前言 感觉Ruby在苹果系统中充当一种脚本语言来使用。 1、直接输入ruby没有反应 2、可显示结果的命令 ruby -e "puts Goodbye, cruel world!" 效果如下图&#xff1a; 说明苹果系统中ruby已经安装完毕&#xff0c;或者就是自带的。 3、编辑运行第一个ruby程序 输入…

nodejs+express+vue教辅课程辅助教学系统 43x2u前后端分离项目

目录 技术栈具体实现截图系统设计思路技术可行性nodejs类核心代码部分展示可行性论证研究方法解决的思路Express框架介绍源码获取/联系我 技术栈 该系统将采用B/S结构模式&#xff0c;开发软件有很多种可以用&#xff0c;本次开发用到的软件是vscode&#xff0c;用到的数据库是…

Linux常见查看文件命令

目录 一、cat 1.1. 查看文件内容 1.2. 创建文件 1.3. 追加内容到文件 1.4. 连接文件 1.5. 显示多个文件的内容 1.6. 使用管道 1.7. 查看文件的最后几行 1.8. 使用 -n 选项显示行号 1.9. 使用 -b 选项仅显示非空行的行号 二、tac 三、less 四、more 五、head 六、…

解决Gson将长数字( json字符串)转换为科学记数法格式

Gson&#xff08;又称Google Gson&#xff09;是Google公司发布的一个开放源代码的Java库&#xff0c;主要用途为序列化Java对象为JSON字符串&#xff0c;或反序列化JSON字符串成Java对象。 依赖 Gradle: dependencies {implementation com.google.code.gson:gson:2.11.0 }…

nginx基础篇(一)

文章目录 学习链接概图一、Nginx简介1.1 背景介绍名词解释 1.2 常见服务器对比IISTomcatApacheLighttpd其他的服务器 1.3 Nginx的优点(1)速度更快、并发更高(2)配置简单&#xff0c;扩展性强(3)高可靠性(4)热部署(5)成本低、BSD许可证 1.4 Nginx的功能特性及常用功能基本HTTP服…

内存压力测试工具的开发与实现

内存压力测试工具的开发与实现 一、工具设计概述二、工具实现1. 伪代码设计2. C代码实现三、工具使用与扩展四、结论在软件开发过程中,内存稳定性与可靠性是确保系统长期稳定运行的关键因素。为了验证系统在高负载下的内存表现,内存压力测试工具显得尤为重要。本文将基于C语言…

上市公司-客户ESG数据集(dta+xlsx+参考文献)(2009-2023年)

参考《经济问题》中李普玲&#xff08;2024&#xff09;的做法&#xff0c;将供应商与主要客户数据对应起来&#xff0c;并对上市公司及关联上市公司的ESG数据进行匹配&#xff0c;形成“供应商——客户ESG”的数据集&#xff0c;保留客户的销售占比 一、数据介绍 数据名称&am…

pdf文件怎么转换成ppt?介绍几种pdf转ppt的方法

pdf文件怎么转换成ppt&#xff1f;将pdf文件转换成ppt格式是一种常见且实用的需求&#xff0c;特别是在制作演示文稿和准备报告时。pdf格式因其文件内容的固定排版和高兼容性而广泛应用于文档的保存和分享。然而&#xff0c;在某些情况下&#xff0c;将pdf文件转换为ppt格式可以…

开源 AI 智能名片 S2B2C 商城小程序中的全渠道供应策略

摘要&#xff1a;本文深入探讨在开源 AI 智能名片 S2B2C 商城小程序的情境下&#xff0c;全渠道供应的运行机制。阐述各环节企业相互配合的重要性&#xff0c;重点分析零售企业在其中的关键作用&#xff0c;包括协调工作、信息传递、需求把握等方面&#xff0c;旨在实现高效的全…

鸿蒙开发之ArkUI 界面篇 十二 背景属性

backgroundColor背景色(纯颜色&#xff0c;没法实现立体感之类高级效果)、 backgroundImage背景图(一般是设计师设计好的图)、 backgroundImageSize背景图尺寸(用于调整背景图的尺寸)、 backgroundImagePosition背景图位置(用于调整背景图的位置)。 背景图的添加是属性backgrou…

测试工程师学历路径:从功能测试到测试开发

现在软件从业者越来越多&#xff0c;测试工程师的职位也几近饱和&#xff0c;想要获得竞争力还是要保持持续学习。基本学习路径可以从功能测试-自动化测试-测试开发工程师的路子来走。 功能测试工程师&#xff1a; 1、软件测试基本概念&#xff1a; 学习软件测试的定义、目的…

使用ShardingSphere实现MySql的分库分表

目录 一 什么是ShardingSphere分库分表 二 代码实现 1.导入相关依赖 2.配置相关参数 3.创建学生类以及mapper接口 4.实现 StandardShardingAlgorithm接口自定义分片算法 唐洋洋我知道你在看!!!嘿嘿 一 什么是ShardingSphere分库分表 我们平时在设计数据库的时候&#xf…