【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)
引言:随着信息技术的飞速发展,大数据已成为推动各行各业创新与变革的重要力量。大数据应用型产品,作为连接海量数据与实际应用需求的桥梁,其设计方法不仅要求深入理解数据特性,还需精准把握用户需求,以实现…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...
12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...
R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...
Python Einops库:深度学习中的张量操作革命
Einops(爱因斯坦操作库)就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库,用类似自然语言的表达式替代了晦涩的API调用,彻底改变了深度学习工程…...
2025年- H71-Lc179--39.组合总和(回溯,组合)--Java版
1.题目描述 2.思路 当前的元素可以重复使用。 (1)确定回溯算法函数的参数和返回值(一般是void类型) (2)因为是用递归实现的,所以我们要确定终止条件 (3)单层搜索逻辑 二…...
goreplay
1.github地址 https://github.com/buger/goreplay 2.简单介绍 GoReplay 是一个开源的网络监控工具,可以记录用户的实时流量并将其用于镜像、负载测试、监控和详细分析。 3.出现背景 随着应用程序的增长,测试它所需的工作量也会呈指数级增长。GoRepl…...
接口 RESTful 中的超媒体:REST 架构的灵魂驱动
在 RESTful 架构中,** 超媒体(Hypermedia)** 是一个核心概念,它体现了 REST 的 “表述性状态转移(Representational State Transfer)” 的本质,也是区分 “真 RESTful API” 与 “伪 RESTful AP…...
