【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 。

当我们登录linux服务器时,系统会给我们分配一个终端文件,并且给这个终端文件关联一个bash进程,而更重要的是,这个bash进程也一定是一个进程组,此时分配的这个终端文件和关联的进程组就构建了一个会话。
那么什么是终端文件呢,你可以理解为就是xshell的一个窗口,这个终端文件存储在linux文件目录下的/dev/pts目录下,我们可以做一个实验来证明:

我们将“hello”写入到/dev/pts/1这个文件中就会发现,在另一个新打开的窗口中显示了出来。
并且每新打开一个窗口,系统中会新增一个bash进程,并且他们属于不同的会话(会话ID不同)。

所以我们已经证明了,一个新的窗口也是一个新的会话,每打开一个会话都会有新的终端文件和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) 。
例如:

我们后台运行了两个作业,通过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
- 设置文件掩码为0。
- fork后终止父进程,子进程创建新会话,所以守护进程是一种特殊的孤儿进程。
- 忽略SIGCHLD信号。
- 再次fork,终止父进程,保持子进程不是会话首进程,从而保证后续不会再和其他终端相关联。
- 更改工作目录为根目录。
- 将标准输入、标准输出、标准错误重定向到/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什么是作业、作业控制?3.2作业号3.3常见作业状态3.4作业的切换 4.守护进程4.1什么是守护进程?4.2如何创建守护进程4.3模拟实现daemon …...
红黑树的插入与删除
文章目录 红黑树概念红黑树的性质: 红黑树的插入操作情况一情况二情况三 小总结红黑树的验证红黑树的删除一.删除单孩子节点1. 删除节点颜色为黑色2. 删除颜色为红色 二. 删除叶子节点1. 删除节点为红色2.删除节点为黑色2.1兄弟节点为黑色,有孩子节点&am…...
联通数科如何基于Apache DolphinScheduler构建DataOps一体化能力平台
各位小伙伴晚上好,我是联通数字科技有限公司数据智能事业部的王兴杰。 今天,我将和大家聊一聊联通数字科技有限公司是如何基于Apache DolphinScheduler构建DataOps一体化能力平台的。 今天的分享主要分为三个部分: 关于DataOps的一些思考&a…...
Python知识点:如何使用Mitmproxy进行HTTP/HTTPS流量分析
Mitmproxy 是一个强大的中间人代理工具,可以用来分析和修改 HTTP 和 HTTPS 流量。以下是如何使用 Mitmproxy 进行 HTTP/HTTPS 流量分析的步骤: 安装 Mitmproxy 首先,你需要在系统上安装 Mitmproxy。可以通过以下方式安装: 使用 …...
06:【stm32】OLED模块的简单使用
OLED模块的简单使用 OLED简单的使用 OLED简单的使用 OLED驱动函数是使用B站UP江科大的。我们直接调用即可,是使用软件模拟I2C协议进行通信的。具体的I2C协议可查看上官嵌入式开发中的C51单片机开发。 驱动函数文件:通过百度网盘分享的文件:…...
HIVE4.0.0的10000端口启动不起来的一种情况
问题 原生态部署HIVE4.0.0启动不起来10000端口,也没找到日志文件的位置,后来才知道日志文件默认在/tmp/<hostname>/路径下面,查看日志以为是Tez没安装的问题,我这儿要实现hive on spark,是不是该安装spark然后启…...
[极客大挑战 2019]FinalSQL1
打开题目 sql注入,点击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 设置标签,并在标签中判断符合条件后,跳到指定标签位置。 示例如下: package mainimport "…...
自反射 RAG 管道:如何实现?
什么是 Self-RAG? 人工智能中的自反射 RAG(检索增强生成)管道是指一种自适应和自我改进的系统,它结合了信息检索和语言生成过程,以提供更准确和特定于上下文的响应。这种类型的管道超越了标准的RAG 管道,它结合了一种自反射机制,使其能够评估其性能,确定需要改进的领域…...
怎么将jar注册为windows系统服务详细操作
将spring boot项目编译成jar,注册为windows系统服务 在网上了解到,winsw这个开源项目,去github看了下,作者常年维护更新,文档齐全,拥有不少,自己写了个小demo体验了下还不错,然后又运行了一个晚上,没啥问题,遂决定采用它 开源地址 源库地址 https://github.com/winsw/winsw R…...
数据结构.
1:基本大纲 数据结构、算法线性表:顺序表、链表、栈、队列树:二叉树、遍历、创建查询方法、排序方式 2:数据结构(逻辑结构,存储结构,操作(数据的运算)) 2.1:数据…...
thinkphp5之sql注入漏洞-builder处漏洞
目录 适用版本 环境搭建 文件下载安装 配置文件修改 漏洞分析 适用版本 注:thinkphp版本:5.0.13<ThinkPHP<5.0.15 、 5.1.0<ThinkPHP<5.1.5 环境搭建 文件下载安装 在github上面下载相应版本,下载think文件,…...
30集 如何编写ESP32程序接入AIGC实现更多有趣的功能-《MCU嵌入式AI开发笔记》
30集 如何编写ESP32程序接入AIGC实现更多有趣的功能(温度)-《MCU嵌入式AI开发笔记》 前言 之前我们建立了ESP-IDF和ESP-ADF开发环境,验证了硬件,验证了AI-CHAT的AI聊天工程,并且深入学习了cmake编译过程,…...
【JUC】Java对象内存布局和对象头
文章目录 面试题Object object new Object() 谈谈你对这句话的理解? 对象在堆内存中存储布局权威定义(周志明老师JVM第三版)对象在堆内存中的存储布局详解对象头的MarkWord源码对象标记源码 对象内存布局(使用JOL证明)…...
简单介绍一下css中transform的内容
在CSS中,transform属性用于对元素进行变换,包括旋转、缩放、倾斜和平移等操作。以下是transform属性中常用的属性: translate:用于元素的平移操作,可以指定元素在X轴和Y轴方向上的平移距离。 rotate:用于元…...
C 循环
C 循环 在C编程语言中,循环是一种控制结构,它允许我们重复执行一段代码多次。这是编程中非常基础且强大的功能,广泛应用于各种算法和数据处理的场景中。本文将详细介绍C语言中的循环概念,包括不同类型的循环语句及其使用方法。 …...
什么是设计模式?一文理解,通俗易懂!
前言 最近在学框架的时候,老师总是时不时带两句设计模式,什么工厂模式,单例模式,开发框架用到就提一嘴,但是没有细讲,为了搞懂啥是设计模式,为哈开发框架用到它,我就查找资料&#…...
doxygen制作接口文档
系列文章目录 文章目录 系列文章目录前言一、下载二、安装三、代码注释四、使用doxygen生成文档 前言 每次手动写接口文档太痛苦了,现在福利来了–doxygen Doxygen是软件开发中广泛使用的文档生成器工具。它自动从源代码注释生成文档,解析有关类、函数和…...
PDF怎么在线转Word?介绍四种转换方案
PDF怎么在线转Word?在数字化办公时代,文档的互换性变得尤为重要。PDF格式因其跨平台兼容性和版面固定性而广受欢迎,但有时我们可能需要将PDF文件转换为Word文档,以便进行编辑或进一步处理。以下是四种常见的在线PDF转Word的方法&a…...
大数据应用型产品设计方法及行业案例介绍(可编辑110页PPT)
引言:随着信息技术的飞速发展,大数据已成为推动各行各业创新与变革的重要力量。大数据应用型产品,作为连接海量数据与实际应用需求的桥梁,其设计方法不仅要求深入理解数据特性,还需精准把握用户需求,以实现…...
IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...
从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践
作者:吴岐诗,杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言:融合数据湖与数仓的创新之路 在数字金融时代,数据已成为金融机构的核心竞争力。杭银消费金…...
