【Linux】进程间关系与守护进程
文章目录
- 1. 进程组
- 2. 会话
- 2.1 什么是会话
- 2.2 如何创建会话
- 2.3 守护进程
- 3. 作业控制

1. 进程组
我们运行下面的命令
sleep 10000 | sleep 20000 | sleep 30000
然后查看进程的信息:
可以看到,其实每一个进程除了有进程PID、PPID之外,还属于一个进程组(PGID)。 进程组是一个或者多个进程的集合,一个进程组可以包含多个进程,每一个进程组也有一个唯一的进程组 ID(PGID)。
进程组的ID一般是组长的ID,即组中最先创建的进程的PID。
-
进程组组长的作用: 进程组组长可以创建一个进程组或者创建该组中的进程
-
进程组的生命周期: 从进程组创建开始到其中最后一个进程离开为止。 注意:只要某个进程组中有一个进程存在, 则该进程组就存在, 这与
其组长进程是否已经终止无关
。
2. 会话
2.1 什么是会话
系统登录时,会创建终端文件 + bash进程;会话 = bash进程 + 终端文件 (每一个新的登录,都会形成一个-bash进程)
终端文件:
/dev/pts/
向不同的终端文件中输出,就会在其会话页面中显示
- 会话其实和进程组息息相关,会话可以看成是一个或多个进程组的集合,一个会话可以包含多个进程组。
- 每一个会话也有一个会话 ID(SID,一般是会话中的第一个进程,即bash )
下面是我在同一个会话中运行了两个程序查询出来的结果
2.2 如何创建会话
那如何创建一个会话呢?
可以调用 setsid
函数来创建一个会话, 前提是调用进程不能是一个进程组的组长。
#
include <unistd.h>
/*
*功能: 创建会话
*返回值: 创建成功返回 SID, 失败返回-1
*/
pid_t setsid(void);
该接口调用之后会发生:
- 调用进程会变成新会话的会话首进程。 此时,新会话中只有唯一的一个进程
- 调用进程会变成进程组组长。 新进程组 ID 就是当前调用进程 ID
- 该进程没有控制终端。 如果在调用 setsid 之前该进程存在控制终端,则调用之后会切断联系
需要注意的是:
- 这个接口如果调用进程原来是进程组组长,则会报错,为了避免这种情况,我们通常的使用方法是先调用 fork创建子进程,父进程终止,子进程继续执行。
- 因为子进程会继承父进程的进程组 ID,而进程 ID 则是新分配的,就不会出现错误的情况。
2.3 守护进程
守护进程(Daemon Process)是一种在后台运行的特殊进程,通常用于执行特定的任务或服务,而不需要用户直接交互。
守护进程的特点
- 后台运行:守护进程在后台运行,不会在前台显示任何界面或交互窗口。它独立于用户终端,即使用户注销,守护进程仍然可以继续运行。
- 独立于控制终端:守护进程通常与控制终端分离,这意味着它不会因终端的关闭而终止。例如,一些网络服务(如 Web服务器)会以守护进程的形式运行,确保服务的持续可用性。
那如何创建守护进程呢?
- 创建子进程并退出父进程:通过 fork() 创建子进程,父进程退出。这样可以确保子进程不会被终端挂起。
- 创建新会话:通过 setsid() 创建一个新的会话,使子进程成为会话的领导者,从而脱离控制终端。
- 改变工作目录:通常将工作目录更改为根目录(/),以避免守护进程因当前工作目录被卸载而导致问题。
- 关闭文件描述符:关闭所有打开的文件描述符,避免资源泄漏。
const char *root = "/";
const char *dev_null = "/dev/null";
void Daemon(bool ischdir,bool isclose)
{//1. 忽略可能引起程序异常退出的信号signal(SIGCHLD,SIG_IGN);signal(SIGPIPE,SIG_IGN);int rid = fork(); //2.创建子进程if(rid > 0){exit(1); //父进程直接退出}int id = setsid(); //3.子进程调用,子进程独立成立一个会话// 4. 每一个进程都有自己的 CWD, 是否将当前进程的 CWD 更改成为 /根目录//以避免守护进程因当前工作目录被卸载而导致问题if(ischdir)chdir(root);// 5. 已经变成守护进程啦,不需要和用户的输入输出,错误进行关联了if(isclose){close(0);close(1);close(2);}else{//避免后面有向0,1,2中操作的,为了防止失败//一般将0、1、2重定向到“黑洞”(任何写入到 /dev/null 的数据都会被永久丢弃,不会保存在任何地方)int fd = open(dev_null,O_RDWR);if(fd > 0){dup2(fd,0);dup2(fd,1);dup2(fd,2);close(fd); //避免fd泄漏,重定向后关闭}}
}
如何将一个服务器守护进程化呢?特别简单,直接调用Daemon即可
// ./server port
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;
}
即使当前会话关闭了,守护进程依旧还在。它是一个独立的会话
3. 作业控制
- 什么是作业?
作业是针对用户来讲的,一个进程组要完成的任务,一般叫做作业。
一个作业既可以只包含一个进程,也可以包含多个进程,进程之间互相协作完成任务(通常是通过进程管道)。
Shell 分前后台来控制的不是进程而是作业或者进程组。 一个前台作业可以由多个进程组成,一个后台作业也可以由多个进程组成, Shell 可以同时运行一个前台作业和任意多个后台作业,这称为作业控制。
例如:下面通过管道协作的sleep命令就是一个作业
此时无论执行什么(只要会话不退出),都不会影响后台作业。
放在后台执行的程序或命令称为后台命令,可以在命令的后面加上
&
符号从而让Shell识别这是一个后台命令,后台命令不用等待该命令执⾏完成,就可立即接收新的命令,另外后台进程执行完后会返回一个作业号以及一个进程号(PID)。
- 作业控制
将作业放回前台:fd + 作业号
如果再想将作业放回后台,要先暂停作业(Ctrl + z
),然后再bg + 作业号
,才可将作业切回到后台运行。
我们可以直接通过输入 jobs 命令查看本用户当前后台执⾏或挂起的作业
- 参数-l 则显示作业的详细信息
- 参数-p 则只显示作业的 PID
关于作业号后面的+、-号
对于一个用户来说,只能有一个默认作业(+号),同时也只能有一个即将成为默认作业的作业(-号),当默认作业退出后,该作业会成为默认作业。
- +:表示该作业号是默认作业
- -:表示该作业即将成为默认作业
- 无符号:表示其他作业
- 作业状态
常见的作业状态如下表所示:
- 作业控制相关的信号
上面我们提到了键入 Ctrl + Z 可以将前台作业挂起,实际上是将 STGTSTP 信号发送至前台进程组作业中的所有进程, 后台进程组中的作业不受影响。
在 unix系统中, 存在 3 个特殊字符可以使得终端驱动程序产生信号,并将信号发送至前台进程组作业,它们分别是:
- Ctrl + C: 中断字符, 会产生 SIGINT 信号
- Ctrl + \: 退出字符, 会产生 SIGQUIT 信号
- Ctrl + Z: 挂起字符, 会产生 STGTSTP 信号
相关文章:
【Linux】进程间关系与守护进程
文章目录 1. 进程组2. 会话2.1 什么是会话2.2 如何创建会话2.3 守护进程 3. 作业控制 1. 进程组 我们运行下面的命令 sleep 10000 | sleep 20000 | sleep 30000然后查看进程的信息: 可以看到,其实每一个进程除了有进程PID、PPID之外,还属于…...
如何通过AI让PPT制作更轻松:从AI生成PPT到一键智能生成
如何通过AI让PPT制作更轻松:从AI生成PPT到一键智能生成!在这个信息爆炸的时代,PPT几乎成了每个人办公必备的工具。但说到制作PPT,很多人头疼不已——排版、设计、内容的整理,时间一不小心就被浪费掉了。有没有一种方法…...
解决前后端日期传输因时区差异导致日期少一天的问题
前端处理 1. 发送日期字符串而非时间戳 在前端使用日期选择器(如 el-date-picker)获取日期后,将日期转换为特定格式的字符串(如 YYYY-MM-DD)发送给后端,避免直接发送带有时区信息的时间戳或日期对象。这样…...
vue2和vue3生命周期的区别通俗易懂
用最直白的对比帮你理解 Vue2 和 Vue3 生命周期的区别,就像对比手机系统的升级: 一、生命周期阶段对比表(老手机 vs 新手机) 阶段Vue2(老系统)Vue3(新系统)变化说明初始化beforeCre…...
在 Ubuntu 20.04 为 Clash Verge AppImage 创建桌面图标教程
在 Ubuntu 20.04 为 AppImage 创建桌面图标教程 一、准备工作 确保你已经下载了 xxxx.AppImage 文件,并且知道它所在的具体路径。同时,你可以准备一个合适的图标文件(.png 格式)用于代表该应用程序,如果没有合适的图…...
Dockerfile 编写推荐
一、导读 本文主要介绍在编写 docker 镜像的时候一些需要注意的事项和推荐的做法。 虽然 Dockerfile 简化了镜像构建的过程,并且把这个过程可以进行版本控制,但是不正当的 Dockerfile 使用也会导致很多问题。 docker 镜像太大。如果你经常使用镜像或者…...
Flutter 中的生命周期
在 Flutter 中,StatefulWidget 和 StatelessWidget 这两种 Widget 的生命周期不同,主要关注的是 StatefulWidget,因为它涉及到状态的管理和更新。 StatefulWidget 的生命周期: 1. 创建阶段 (Create) createState():…...
AI大模型的文本流如何持续吐到前端,实时通信的技术 SSE(Server-Sent Events) 认知
写在前面 没接触过 SSE(Server-Sent Events),AI大模型出来之后,一直以为文本流是用 WebSocket 做的偶然看到返回到报文格式是 text/event-stream,所以简单认知,整理笔记博文内容涉及 SSE 认知,以及对应的 D…...
项目版本号生成
需求 项目想要生成一个更新版本号,格式为v2.0.20250101。 其中v2.0为版本号,更新时进行配置;20250101为更新日期,版本更新时自动生成。 实现思路 创建一个配置文件version.properties,在其中配置版本号;…...
Spring AI发布!让Java紧跟AI赛道!
1. 序言 在当今技术发展的背景下,人工智能(AI)已经成为各行各业中不可忽视的重要技术。无论是在互联网公司,还是传统行业,AI技术的应用都在大幅提升效率、降低成本、推动创新。从智能客服到个性化推荐,从语…...
ubuntu服务器 如何配置安全加固措施
下面提供一个更详细、一步步的服务器安全加固指南,适合新手操作。我们将从 Fail2Ban、SSH(密钥认证及端口更改)、Nginx 速率限制和日志轮转四个方面进行优化,同时补充一些额外的安全建议。 新的服务器,通常我们会创建一…...
京东java面试流程_java京东社招面试经历
个人背景:java开发工作2年,跳槽2次,被裁一次,无大厂经历,京东内推。整体感觉不错的面试经历,最后败了。 一、面试流程 (1)上机题(60分钟100道选择题,单选多选混合的) (2)技术面(java基础知识…...
多表查询、事务(MySQL笔记第三期)
p.s.这是萌新自己自学总结的笔记,如果想学习得更透彻的话还是请去看大佬的讲解 目录 多表关系多表查询内连接外连接左外连接右外连接 自连接联合查询子查询标量子查询列子查询行子查询表子查询 例题事务方式一方式二事务四大特性(ACID)并发事务问题隔离事务级别 多…...
python电影数据分析及可视化系统建设
博主介绍:✌程序猿徐师兄、8年大厂程序员经历。全网粉丝15w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…...
【06】泛型
文章目录 泛型函数中的泛型结构体中的泛型结构体中的方法 枚举中的泛型 泛型 RUST通过在编译时对泛型代码的单态化(monomorphization)来保证运行效率。即,在编译时对泛型填充具体数据类型转换为特定代码进行编译。 由于RUST编译试图穷举所有…...
C# 鼠标点击ToolStripStatuslabel 在线修改Text属性并存储加载显示Text属性
在实际项目中为方便了解视觉软件的使用性,可能需要添加一些小而稍微实用的功能:一个StipStatus控件上的Label按钮属性Text需要修改并保存,软件重启后能够自动加载修改后的属性名。 定义变量 public static string controlsText System.Windows.Forms.A…...
Deep seek学习日记1
Deepseek最强大的就是它的深度思考,并且展现了它的思考过程。 五种可使用Deep seek的方式(应该不限于这五种,后续嵌入deepseek的应该更多,多了解一点因为官网容易崩~~): 1.deep seek官网 2.硅基流动silicon…...
我的docker随笔46:在x86平台构建龙芯镜像
本文介绍在x86服务器上构建龙芯平台的docker镜像。 前言 去年11月,在龙芯机器上安装了docker工具,并开始尝试研究如何构建龙芯的文件系统。断断续续搞了2个月后,有点结果出来了。前面有文章介绍了如何用debootstrap构建龙芯编译运行环境&…...
某大型业务系统技术栈介绍【应对面试】
微服务架构【图】 微服务架构【概念】 微服务架构,是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值。在微服务架构中,服务与服务之间通信时,通常是…...
wordpress资讯类网站整站打包
wordpress程序,内置了价值499元的模板.但是有了模板没有全自动采集相信大多数人都搞不懂,目录那么多,全靠原创几乎是不可能的事情,除非你是大公司,每人控制一个板块, 这套源码里面最有价值的应该是这个采集…...
移动端测试的挑战与解决方案:兼容性、网络问题及实战策略
引言 移动应用已成为用户触达服务的核心入口,但移动端测试面临设备多样性、网络波动、用户场景复杂等多重挑战。据Statista统计,2023年全球活跃移动设备超180亿台,操作系统(Android/iOS)版本碎片化率超30%,这对测试工程师提出了极高要求。本文深度解析移动端测试的核心痛…...
基于JAVA的幼儿园管理系统的设计与实现源码(springboot+vue+mysql)
项目简介 幼儿园管理系统实现了以下功能: 基于JAVA的幼儿园管理系统的设计与实现的主要使用者管理员可以管理系统基本信息;管理轮播图、系统简介、教师管理、课程管理、幼儿活动管理、餐饮管理、留言管理等功能;前台用户注册登录࿰…...
【Java学习】二维数组
一个数组变量里存的是哈希值(存的大小内容是固定的),它指向对应在堆区上的数组空间,当一个数组变量里存的哈希值指向的在堆上的数组空间里面的一个个引用元素存储的是一个个哈希值指向在堆区上的又一个个数组空间时,此时就形成了二维数组&…...
express + vue 部署宝塔
域名备案 我这里是不同的账号,需要先登录服务器的账号生成授权码给到对应域名的账号。目前域名审核中。 进入域名账号,进行备案即可。 登录阿里云密码设置 未设置登录远程服务的密码,要先设置密码。 登录服务 设置安全组 根据宝塔的需要端…...
前端与后端的对接事宜、注意事项
前端与后端的对接事宜、注意事项 一、对接核心流程(完整生命周期) #mermaid-svg-6yzij6OD8DKqiMLD {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-6yzij6OD8DKqiMLD .error-icon{fill:#552222;}#mermaid-svg-6yzi…...
【计算机网络】传输层数据段格式
在计算机网络中,数据段(Segment) 是传输层协议(如 TCP 或 UDP)使用的数据单元。TCP 和 UDP 的数据段格式有所不同,以下是它们的详细说明: 1. TCP 数据段格式 TCP(传输控制协议&…...
web第三次作业
弹窗案例 1.首页代码 <!DOCTYPE html><html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>综合案例</title><st…...
深度学习(1)-简单神经网络示例
我们来看一个神经网络的具体实例:使用Python的Keras库来学习手写数字分类。在这个例子中,我们要解决的问题是,将手写数字的灰度图像(28像素28像素)划分到10个类别中(从0到9)。我们将使用MNIST…...
DeepSeek 模型部署与使用技术评测(基于阿里云零门槛解决方案)
引言 随着人工智能技术的不断发展,越来越多的企业和个人开始探索如何利用深度学习模型来提升业务效率和用户体验。阿里云推出的【零门槛、轻松部署您的专属 DeepSeek 模型】解决方案为用户提供了多种便捷的部署方式,包括基于百炼 API 调用满血版、基于人…...
学习笔记之debian的thonny开发(尚未验证)--从stm32裸机到linux嵌入式系统
这应该算 stm32裸机用户 转 linux嵌入式系统 的入门学习笔记。 【鲁班猫】39-vnc远程桌面连接鲁班猫_哔哩哔哩_bilibili 本集的鲁班猫的视频介绍中,没有清晰明确指出需要linux开发板接入网络,接入网络可以使用有线网口或者wifi路由,有些提示…...
web集群(LVS-DR)
LVS是Linux Virtual Server的简称,也就是Linux虚拟服务器, 是一个由章文嵩博士发起的自由软件项 目,它的官方站点是 www.linuxvirtualserver.org。现在LVS已经是 Linux标准内核的一部分,在 Linux2.4内核以前,使用LVS时必须要重新编…...
Base64 PDF解析器
<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>Base64 PDF解析器</title><style>body {font-family: Arial, sans-serif;max-width: 800px;margin: 20px auto;padding: 20px;}.contain…...
降本增效 - VGF 构建轻量高性能日志管理平台
VFG 技术架构 Filebeat 接收Syslog ,并进行日志分段,VictoriaLogs 持久化存储日志 ,Grafana 可视化、数据查询、告警、数据导出。 为什么要用VictoriaLogs ? 与Elasticsearch /Grafana Loki相比几十倍的CPU/内存/存储资源占用的…...
leetcode:627. 变更性别(SQL解法)
难度:简单 SQL Schema > Pandas Schema > Salary 表: ----------------------- | Column Name | Type | ----------------------- | id | int | | name | varchar | | sex | ENUM | | salary | int …...
高等代数笔记—欧几里得空间、双线性函数
欧几里得空间 欧几里得空间(欧氏空间) V V V定义: V V V是实数域 R R R上线性空间 在 V V V上定义了一个二元实函数,称为内积,记作 ( α , β ) (\alpha,\beta) (α,β),并且内积满足以下性质:…...
Linux 网络设备驱动中的 netdev_priv 函数详解
在 Linux 内核的网络设备驱动开发中,netdev_priv 函数是一个非常重要的工具,用于访问网络设备的私有数据。本文将详细讲解 netdev_priv 函数的作用、实现原理以及使用方法,并结合代码示例进行说明。 一、netdev_priv 函数的作用 在 Linux 内核中,struct net_device 是描述…...
基于实例详解pytest钩子pytest_generate_tests动态生成测试的全过程
关注开源优测不迷路 大数据测试过程、策略及挑战 测试框架原理,构建成功的基石 在自动化测试工作之前,你应该知道的10条建议 在自动化测试中,重要的不是工具 作为一名软件开发人员,你一定深知有效测试策略的重要性,尤其…...
20250213 隨筆 雪花算法
雪花算法(Snowflake Algorithm) 雪花算法(Snowflake) 是 Twitter 在 2010 年開發的一種 分布式唯一 ID 生成算法,它可以在 高併發場景下快速生成全局唯一的 64-bit 長整型 ID,且不依賴資料庫,具…...
Bug日记:Linux中systemctl restart network失败问题,网络故障
日期 2023年10月25日 问题描述 在尝试使用 systemctl restart network 重启网络服务时,出现以下错误: Job for network.service failed because the control process exited with error code. See "systemctl status network.service" and …...
计算四个锚点TOA定位中GDOP的详细步骤和MATLAB例程
该MATLAB代码演示了在三维空间中,使用四个锚点的TOA(到达时间)定位技术计算几何精度衰减因子(GDOP)的过程。如需帮助,或有导航、定位滤波相关的代码定制需求,请联系作者 文章目录 DOP计算原理MATLAB例程运行结果示例关键点说明扩展方向另有文章: 多锚点Wi-Fi定位和基站…...
poi 将图片写入到excel文件中
功能点说明 作用:将图片写入到指定的excel文件(或output流) 依赖 <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version> </dependen…...
新数据结构(9)——Java异常体系
异常的种类 程序本身通常无法主动捕获并处理错误(Error),因为这些错误通常表示系统级的严重问题,但程序可以捕获并处理异常(Excrption),而Error则被视为一种程序无法或不应尝试恢复的异常类型。…...
HTTP 响应头信息
HTTP 响应头信息 引言 HTTP(超文本传输协议)是互联网上应用最为广泛的网络协议之一。它定义了客户端与服务器之间交互的基本规则。在HTTP协议中,响应头信息扮演着至关重要的角色。本文将详细介绍HTTP响应头信息的概念、类型、作用及其在实际应用中的重要性。 响应头信息概…...
计算机视觉:卷积神经网络(CNN)基本概念(一)
第一章:计算机视觉中图像的基础认知 第二章:计算机视觉:卷积神经网络(CNN)基本概念(一) 第三章:计算机视觉:卷积神经网络(CNN)基本概念(二) 第四章:搭建一个经典的LeNet5神经网络 一、引言 卷积神经网络&…...
C#: String s = new String(“Hello“)无法编译?编程语言字符集有两个?为什么这种变量名“\u0061\u0062”都能编译通过?
C#: String s new String("Hello")无法编译? C# String类型是literal常量,默认不能用new创建,但可以在unsafe下用char *字符串指针创建。 char* charPtr stackalloc char[2]; charPtr[0] H; charPtr[1] \0; String myString new Strin…...
网络安全学习笔记之Internet基本知识
Internet构成 根据工作方式,可以把Internet分为边缘部分和核心部分。边缘部分由连接在Internet上的主机(用户的终端、服务器)组成。用户直接使用边缘部分进行通信和资源共享。核心部分由大量网络和连接这些网络的路由器组成。 服务类别 面向…...
【设计模式】【结构型模式】装饰者模式(Decorator)
👋hi,我不是一名外包公司的员工,也不会偷吃茶水间的零食,我的梦想是能写高端CRUD 🔥 2025本人正在沉淀中… 博客更新速度 👍 欢迎点赞、收藏、关注,跟上我的更新节奏 🎵 当你的天空突…...
3D可视化定制:开启个性化消费新时代
3D可视化定制是一种将产品的三维模型与可视化技术相结合,以满足消费者个性化需求的服务。以下是对3D可视化定制的详细介绍: 一、定义与原理 3D可视化定制是指利用三维建模技术和可视化工具,为消费者提供一个直观、互动且高度个性化的定制平…...
CRMEB 多商户版v3.0.1源码全开源+PC端+Uniapp前端+搭建教程
一.介绍 crmeb多商户是一套B2B2C商家入驻模式的平台多商户商城系统,系统支持平台自营、联营、招商等多种运营模式,可满足企业新零售、批发、分销、预售、O2O、多店、商铺入驻等各种业务需求。 后端全开源、uniapp多端可编译! 二、搭建教程…...
java八股文-mysql
1. 索引 1.1 什么是索引 索引(index)是帮助Mysql高效获取数据的数据结构(有序).提高数据的检索效率,降低数据库的IO成本(不需要全表扫描).通过索引列对数据进行排序,降低数据排序成本,降低了CPU的消耗. 1.2 mysql索引使用的B树? 1. 没有使用二叉树,最坏情况o&…...