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

【Linux】【网络】进程间关系与守护进程

进程间关系与守护进程

文章目录

  • 1.进程组
    • 1.1什么是进程组
    • 1.2组长进程
  • 2.会话
    • 2.1什么是会话
    • 2.2如何创建会话
  • 3.作业
    • 3.1什么是作业、作业控制?
    • 3.2作业号
    • 3.3常见作业状态
    • 3.4作业的切换
  • 4.守护进程
    • 4.1什么是守护进程?
    • 4.2如何创建守护进程
    • 4.3模拟实现daemon

1.进程组

1.1什么是进程组

之前我们提到了进程的概念, 其实每一个进程除了有一个进程 ID(PID)之外,还属于一个进程组。 进程组是一个或者多个进程的集合, 一个进程组可以包含多个进程。

每一个进程组也有一个唯一的进程组 ID(PGID), 并且这个 PGID 类似于进程 ID, 同样是一个正整数, 可以存放在 pid_t 数据类型中。

$ ps -eo pid,pgid,ppid,comm | grep test
#结果如下
PID PGID PPID COMMAND
2830 2830 2259 test
# -e 选项表示 every 的意思, 表示输出每一个进程信息
# -o 选项以逗号操作符(,) 作为定界符, 可以指定要输出的列

1.2组长进程

每一个进程组都有一个组长进程。 组长进程的 ID 等于其进程组的 ID。 我们可以通过ps命令看到组长进程的现象。

[node@localhost code]$ ps -o pid,pgid,ppid,comm | cat
# 输出结果
PID PGID PPID COMMAND
2806 2806 2805 bash
2880 2880 2806 ps
2881 2880 2806 cat

从结果上看 ps 进程的 PID 和 PGID 相同, 那也就是说明 ps 进程是该进程组的组长进程, 该进程组包括 ps 和 cat 两个进程。

注意:

  • 进程组组长的作用: 进程组组长可以创建一个进程组或者创建该组中的进程。
  • 进程组的生命周期: 从进程组创建开始到其中最后一个进程离开为止,与其组长进程是否已经终止无关。

2.会话

2.1什么是会话

会话可以看成是一个或多个进程组的集合, 一个会话可以包含多个进程组。

每一个会话也有一个会话 ID(SID) ,会话ID一般是一个会话中的第一个进程ID,一般是bash 。

QQ_1721985581104

当我们登录linux服务器时,系统会给我们分配一个终端文件,并且给这个终端文件关联一个bash进程,而更重要的是,这个bash进程也一定是一个进程组,此时分配的这个终端文件和关联的进程组就构建了一个会话。

那么什么是终端文件呢,你可以理解为就是xshell的一个窗口,这个终端文件存储在linux文件目录下的/dev/pts目录下,我们可以做一个实验来证明:

QQ_1721986579079

我们将“hello”写入到/dev/pts/1这个文件中就会发现,在另一个新打开的窗口中显示了出来。

并且每新打开一个窗口,系统中会新增一个bash进程,并且他们属于不同的会话(会话ID不同)。

QQ_1721986854636

所以我们已经证明了,一个新的窗口也是一个新的会话,每打开一个会话都会有新的终端文件和bash进程。

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

当我们在bash中要求前台执行我们自己的进程时(./myprocess),bash就会自己转化为后台进程,前台进程就变为我们的进程,当我们的进程执行完后或者被强制退出后(ctrl + c),bash就会自动的切换为前台进程。

后台执行在后面加’&',比如 sleep 100 &

最明显的前后台区别是:谁应该从标准输入中获取数据

当会话关闭时, 会话中的进程组都会受到影响,取决于不同的系统。

windows在登录时也是相当于一个会话,当你觉得系统卡顿时,可以尝试“注销”,因为注销就相当于关闭当前会话,相应的会话中的所有进程组会关闭。

2.2如何创建会话

可以调用setseid函数来创建一个会话,前提是调用进程不能是一个进程组的组长

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

调用该函数后:

  • 调用进程会变成新会话的会话首进程。 此时, 新会话中只有唯一的一个进程
  • 调用进程会变成进程组组长。 新进程组 ID 就是当前调用进程 ID 。
  • 该进程没有控制终端。 如果在调用setsid之前该进程存在控制终端, 则调用之后会切断联系。

注意:该函数调用的前提是调用进程不能是一个进程组的组长,所以在调用该函数前,我们需要先创建子进程,让子进程执行该函数。

即:

if(fork()>0) exit(0);setsid();

3.作业

3.1什么是作业、作业控制?

Shell分前后台来控制的不是进程而是作业(Job)或者进程组(Process Group)。

一个前台作业可以由多个进程组成,一个后台作业也可以由多个进程组成,Shell可以运行一个前台作业和任意多个后台作业,这称为作业控制。

3.2作业号

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

例如:

QQ_1721989391073

我们后台运行了两个作业,通过jobs命令可以查看运行的作业信息。

  • 参数-l:则显示作业的详细信息。
  • 参数-p:则只显示作业的 PID。

其中:

  • [1]:1表示作业号;
  • +:表示该作业号是默认作业;
  • -:表示该作业即将成为默认作业 ;
  • 无符号:表示其他作业;
  • Running:表示作业状态。

关于默认作业: 对于一个用户来说, 只能有一个默认作业(+),同时也只能有一个即将成为默认作业的作业(-) ,当默认作业退出后, 该作业会成为默认作业。

3.3常见作业状态

作业状态含义
正在运行【Running】后台作业,表示正在执行。
完成【Done】作业已完成,返回状态码为0。
完成并退出【Done(code)】作业已完成并退出,返回状态码为code(非0)。
已停止【Stopped】前台作业,当前被CTRL + Z挂起
已终止【Terminated】作业被终止

3.4作业的切换

我们可以通过fg 作业号 命令将后台运行的作业切换到前台运行。

同样的我们可以将暂停的作业放到后台运行,首先我们需要CTRL+Z将作业设置为暂停状态,然后利用bg 作业号命令将前台运行的作业切换到后台运行。

4.守护进程

4.1什么是守护进程?

守护进程也称精灵进程(Daemon),是运行在后台的一种特殊进程,它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。

我们知道用户登录的这种行为就会创建出一个会话,而如果我们的服务器进程运行在该会话上,当用户关闭这个会话时,运行在该会话上的进程就会收到影响,这肯定是我们不希望的。

所以我们一般需要将该服务器进程独立出来,即新创建一个会话出来,这样一来,我们的服务器进程就不会受到用户登陆注销影响了,此时这种进程就被称为守护进程

4.2如何创建守护进程

int daemon(int nochdir, int noclose);

参数说明:

  • 如果参数nochdir为0,则将守护进程的工作目录该为根目录,否则不做处理。
  • 如果参数noclose为0,则将守护进程的标准输入、标准输出以及标准错误重定向到/dev/null,否则不做处理。

4.3模拟实现daemon

  1. 设置文件掩码为0。
  2. fork后终止父进程,子进程创建新会话,所以守护进程是一种特殊的孤儿进程
  3. 忽略SIGCHLD信号。
  4. 再次fork,终止父进程,保持子进程不是会话首进程,从而保证后续不会再和其他终端相关联。
  5. 更改工作目录为根目录。
  6. 将标准输入、标准输出、标准错误重定向到/dev/null。

/dev/null,该文件是一个字符类文件,特点:从该文件读到的内容为空,向该文件写入的内容都会被系统丢弃。

void my_daemon(int nochdir, int noclose)
{//1、忽略不要的信号signal(SIGCHLD, SIG_IGN);signal(SIGPIPE, SIG_IGN);//2、fork后终止父进程,子进程创建新会话if (fork() > 0)exit(0);//3、setsidsetsid();//4、确认是否更改工作目录if (nochdir == 0){chdir("/");}//5、将标准输入、标准输出、标准错误重定向到/dev/null(可选的选项)if (noclose == 0){int fd = open("/dev/null", O_RDWR);if(fd>0){dup2(fd, 0);dup2(fd, 1);dup2(fd, 2);close(fd);}}else{close(0);close(1);close(2);}
}

说明:

  • 调用setsid创建新会话时,要求调用进程不能是进程组组长,但是当我们在命令行上启动多个进程协同完成某种任务时,其中第一个被创建出来的进程就是组长进程,因此我们需要fork创建子进程,让子进程调用setsid创建新会话并继续执行后续代码,而父进程我们直接让其退出即可。
  • 我们一般会将守护进程的工作目录设置为根目录,便于让守护进程以绝对路径的形式访问某种资源。(该操作不是必须的)
  • 由于守护进程已经与终端去关联了,因此一般我们会将守护进程的标准输入、标准输出以及标准错误都重定向到/dev/null。

去成为你本应该成为的人,任何时候都不会太晚。 —乔治·艾略特
出来的进程就是组长进程,因此我们需要fork创建子进程,让子进程调用setsid创建新会话并继续执行后续代码,而父进程我们直接让其退出即可。

  • 我们一般会将守护进程的工作目录设置为根目录,便于让守护进程以绝对路径的形式访问某种资源。(该操作不是必须的)
  • 由于守护进程已经与终端去关联了,因此一般我们会将守护进程的标准输入、标准输出以及标准错误都重定向到/dev/null。

去成为你本应该成为的人,任何时候都不会太晚。 —乔治·艾略特

相关文章:

【Linux】【网络】进程间关系与守护进程

进程间关系与守护进程 文章目录 1.进程组1.1什么是进程组1.2组长进程 2.会话2.1什么是会话2.2如何创建会话 3.作业3.1什么是作业、作业控制&#xff1f;3.2作业号3.3常见作业状态3.4作业的切换 4.守护进程4.1什么是守护进程&#xff1f;4.2如何创建守护进程4.3模拟实现daemon …...

红黑树的插入与删除

文章目录 红黑树概念红黑树的性质&#xff1a; 红黑树的插入操作情况一情况二情况三 小总结红黑树的验证红黑树的删除一.删除单孩子节点1. 删除节点颜色为黑色2. 删除颜色为红色 二. 删除叶子节点1. 删除节点为红色2.删除节点为黑色2.1兄弟节点为黑色&#xff0c;有孩子节点&am…...

联通数科如何基于Apache DolphinScheduler构建DataOps一体化能力平台

各位小伙伴晚上好&#xff0c;我是联通数字科技有限公司数据智能事业部的王兴杰。 今天&#xff0c;我将和大家聊一聊联通数字科技有限公司是如何基于Apache DolphinScheduler构建DataOps一体化能力平台的。 今天的分享主要分为三个部分&#xff1a; 关于DataOps的一些思考&a…...

Python知识点:如何使用Mitmproxy进行HTTP/HTTPS流量分析

Mitmproxy 是一个强大的中间人代理工具&#xff0c;可以用来分析和修改 HTTP 和 HTTPS 流量。以下是如何使用 Mitmproxy 进行 HTTP/HTTPS 流量分析的步骤&#xff1a; 安装 Mitmproxy 首先&#xff0c;你需要在系统上安装 Mitmproxy。可以通过以下方式安装&#xff1a; 使用 …...

06:【stm32】OLED模块的简单使用

OLED模块的简单使用 OLED简单的使用 OLED简单的使用 OLED驱动函数是使用B站UP江科大的。我们直接调用即可&#xff0c;是使用软件模拟I2C协议进行通信的。具体的I2C协议可查看上官嵌入式开发中的C51单片机开发。 驱动函数文件&#xff1a;通过百度网盘分享的文件&#xff1a;…...

HIVE4.0.0的10000端口启动不起来的一种情况

问题 原生态部署HIVE4.0.0启动不起来10000端口&#xff0c;也没找到日志文件的位置&#xff0c;后来才知道日志文件默认在/tmp/<hostname>/路径下面&#xff0c;查看日志以为是Tez没安装的问题&#xff0c;我这儿要实现hive on spark&#xff0c;是不是该安装spark然后启…...

[极客大挑战 2019]FinalSQL1

打开题目 sql注入&#xff0c;点击1试一下 点击2试一下 点击3试一下 点击4 点击5 id6试一下 感觉是sql盲注了 编写脚本 import requests import string from time import sleep url "http://9da9cb18-3096-413a-9476-8a177ffec31a.node4.buuoj.cn:81/search.php?id0^(…...

Go语言 标签Label

Go语言 label标签和枚举介绍及使用示例 目录 标签label 标签和goto continue break 枚举 代码示例 说明 总结 标签label 标签和goto 设置标签&#xff0c;并在标签中判断符合条件后&#xff0c;跳到指定标签位置。 示例如下&#xff1a; package mainimport "…...

自反射 RAG 管道:如何实现?

什么是 Self-RAG? 人工智能中的自反射 RAG(检索增强生成)管道是指一种自适应和自我改进的系统,它结合了信息检索和语言生成过程,以提供更准确和特定于上下文的响应。这种类型的管道超越了标准的RAG 管道,它结合了一种自反射机制,使其能够评估其性能,确定需要改进的领域…...

怎么将jar注册为windows系统服务详细操作

将spring boot项目编译成jar,注册为windows系统服务 在网上了解到,winsw这个开源项目,去github看了下,作者常年维护更新,文档齐全,拥有不少,自己写了个小demo体验了下还不错,然后又运行了一个晚上,没啥问题,遂决定采用它 开源地址 源库地址 https://github.com/winsw/winsw R…...

数据结构.

1:基本大纲 数据结构、算法线性表&#xff1a;顺序表、链表、栈、队列树&#xff1a;二叉树、遍历、创建查询方法、排序方式 2:数据结构&#xff08;逻辑结构&#xff0c;存储结构&#xff0c;操作&#xff08;数据的运算&#xff09;&#xff09; 2.1&#xff1a;数据&#xf…...

thinkphp5之sql注入漏洞-builder处漏洞

目录 适用版本 环境搭建 文件下载安装 配置文件修改 漏洞分析 适用版本 注&#xff1a;thinkphp版本&#xff1a;5.0.13<ThinkPHP<5.0.15 、 5.1.0<ThinkPHP<5.1.5 环境搭建 文件下载安装 在github上面下载相应版本&#xff0c;下载think文件&#xff0c;…...

30集 如何编写ESP32程序接入AIGC实现更多有趣的功能-《MCU嵌入式AI开发笔记》

30集 如何编写ESP32程序接入AIGC实现更多有趣的功能&#xff08;温度&#xff09;-《MCU嵌入式AI开发笔记》 前言 之前我们建立了ESP-IDF和ESP-ADF开发环境&#xff0c;验证了硬件&#xff0c;验证了AI-CHAT的AI聊天工程&#xff0c;并且深入学习了cmake编译过程&#xff0c;…...

【JUC】Java对象内存布局和对象头

文章目录 面试题Object object new Object() 谈谈你对这句话的理解&#xff1f; 对象在堆内存中存储布局权威定义&#xff08;周志明老师JVM第三版&#xff09;对象在堆内存中的存储布局详解对象头的MarkWord源码对象标记源码 对象内存布局&#xff08;使用JOL证明&#xff09…...

简单介绍一下css中transform的内容

在CSS中&#xff0c;transform属性用于对元素进行变换&#xff0c;包括旋转、缩放、倾斜和平移等操作。以下是transform属性中常用的属性&#xff1a; translate&#xff1a;用于元素的平移操作&#xff0c;可以指定元素在X轴和Y轴方向上的平移距离。 rotate&#xff1a;用于元…...

C 循环

C 循环 在C编程语言中&#xff0c;循环是一种控制结构&#xff0c;它允许我们重复执行一段代码多次。这是编程中非常基础且强大的功能&#xff0c;广泛应用于各种算法和数据处理的场景中。本文将详细介绍C语言中的循环概念&#xff0c;包括不同类型的循环语句及其使用方法。 …...

什么是设计模式?一文理解,通俗易懂!

前言 最近在学框架的时候&#xff0c;老师总是时不时带两句设计模式&#xff0c;什么工厂模式&#xff0c;单例模式&#xff0c;开发框架用到就提一嘴&#xff0c;但是没有细讲&#xff0c;为了搞懂啥是设计模式&#xff0c;为哈开发框架用到它&#xff0c;我就查找资料&#…...

doxygen制作接口文档

系列文章目录 文章目录 系列文章目录前言一、下载二、安装三、代码注释四、使用doxygen生成文档 前言 每次手动写接口文档太痛苦了&#xff0c;现在福利来了–doxygen Doxygen是软件开发中广泛使用的文档生成器工具。它自动从源代码注释生成文档&#xff0c;解析有关类、函数和…...

PDF怎么在线转Word?介绍四种转换方案

PDF怎么在线转Word&#xff1f;在数字化办公时代&#xff0c;文档的互换性变得尤为重要。PDF格式因其跨平台兼容性和版面固定性而广受欢迎&#xff0c;但有时我们可能需要将PDF文件转换为Word文档&#xff0c;以便进行编辑或进一步处理。以下是四种常见的在线PDF转Word的方法&a…...

大数据应用型产品设计方法及行业案例介绍(可编辑110页PPT)

引言&#xff1a;随着信息技术的飞速发展&#xff0c;大数据已成为推动各行各业创新与变革的重要力量。大数据应用型产品&#xff0c;作为连接海量数据与实际应用需求的桥梁&#xff0c;其设计方法不仅要求深入理解数据特性&#xff0c;还需精准把握用户需求&#xff0c;以实现…...

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端&#xff0c;它允许HTTP与Elasticsearch 集群通信&#xff0c;而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

TDengine 快速体验(Docker 镜像方式)

简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能&#xff0c;本节首先介绍如何通过 Docker 快速体验 TDengine&#xff0c;然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker&#xff0c;请使用 安装包的方式快…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

html-<abbr> 缩写或首字母缩略词

定义与作用 <abbr> 标签用于表示缩写或首字母缩略词&#xff0c;它可以帮助用户更好地理解缩写的含义&#xff0c;尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时&#xff0c;会显示一个提示框。 示例&#x…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列&#xff0c;以便知晓哪些列包含有价值的数据&#xff0c;…...

无人机侦测与反制技术的进展与应用

国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机&#xff08;无人驾驶飞行器&#xff0c;UAV&#xff09;技术的快速发展&#xff0c;其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统&#xff0c;无人机的“黑飞”&…...

C语言中提供的第三方库之哈希表实现

一. 简介 前面一篇文章简单学习了C语言中第三方库&#xff08;uthash库&#xff09;提供对哈希表的操作&#xff0c;文章如下&#xff1a; C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...