尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Linux下 进程间关系与守护进程
欢迎来到我的频道【点击跳转专栏】本文所有代码已托管至码云【点此转跳】文章目录1. 进程组作业1.1 什么是进程组1.2 组⻓进程1.3 作业号1.4 前、后台作业1.4.1 jobs1.4.2 fg1.4.3 bg1.4.4 作业状态1.5 进程组长作业组长进程关闭进程组会消失吗2. 会话2.1 TTY字符文件2.2 什么是会话2.3 关闭会话2.4 创建会话守护进程是什么3. 守护进程的创建3.1 daemon3.2 dev/nulldev/zero3.3 手动实现daemon1. 进程组作业1.1 什么是进程组之前我们提到了进程的概念其实每一个进程除了有一个进程ID(PID)之外还属于一个进程组。进程组是一个或者多个进程的集合一个进程组可以包含多个进程。每一个进程组也有一个唯一的进程组ID(PGID)并且这个PGID类似于进程ID同样是一个正整数可以存放在pid_t数据类型中。1.2 组⻓进程每⼀个进程组都有⼀个组⻓进程。 组⻓进程的ID等于其进程ID。我们可以通过ps命令看到组⻓进程的现象# 输出结果PID PGIDPPIDCOMMAND280628062805bash288028802806ps288128802806cat从结果上看ps进程的PID和PGID相同 那也就是说明ps进程是该进程组的组⻓进程 该进程组包括ps和cat两个进程该组创建的第一个进程一般为进程组长当我创建以下进程这些以前学过都是bash的子进程:当我用ctrl c杀死前台进程的时候 发现该组进程PGID相同都死了说明前后台进程管理是以进程组为单位的ctrl c是向进程组发信号(前台进程)杀死的是进程组中所有进程1.3 作业号当我创建多个后台进程的时候这些1、2、3就是作业号结论进程组和作业号是一个硬币的两面作业要由进程组完成作业强调该组进程要做什么进程组强调如何来完成由谁完成举个例子有一批垃圾要运走这个就是作业而你雇佣了5个农民工移走垃圾这五个农名工就是进程组而进程组就是要完成作业作业分前台、后台作业可以进程键盘输入的叫前台作业启动一项进程组感觉怪怪的的但是启动一项作业就很舒服了作业是站在用户视角的开发者角度就是进程组了你想怎么说都行其实只是视角不同1.4 前、后台作业1.4.1 jobsjobs是bash内建命令只看当前这个shell 会话的后台 / 暂停作业不能看别的终端 shell 的任务1.4.2 fgfg是 Shell 内置命令作业控制作用把后台 / 暂停的作业切换到前台运行。fg# 将当前默认作业放到前台fg%jobnum# 指定作业号把对应作业切前台当前默认作业直接执行 fg / bg不加 % 号就操作它1.4.3 bg我们可以通过ctrlz让前台进程进入T状态 此时该进程会自动由前台进程变成后台我们可以用bg命令启动该进程:作用把已经暂停Stopped的作业在后台恢复运行bg# 对带 的默认作业执行后台恢复bg%jobid# 指定作业号后台继续运行1.4.4 作业状态常⻅的作业状态如下表所⽰1.5 进程组长作业组长进程关闭进程组会消失吗进程组组⻓的作⽤进程组组⻓可以创建⼀个进程组或者创建该组中的进程进程组的⽣命周期从进程组创建开始到其中最后⼀个进程离开为⽌。注意只要某个进程组中有⼀个进程存在 则该进程组就存在 这与其组⻓进程是否已经终⽌⽆关。2. 会话2.1 TTY字符文件TTY 可以理解成“字符设备文件”。指 Linux 中让你输入命令、查看输出的终端设备文件。键盘输入会被 TTY 读取程序输出会通过 TTY 显示到终端图中TTY一栏显示的是pts/0表示这个sleep 1000进程运行在编号为 0 的“伪终端”上。pts是pseudo terminal伪终端的缩写常见于打开 Terminal、SSH 或终端模拟器时。简单说pts/0就是“当前终端窗口”。当然终端窗口本身负责显示界面pts/0 负责在窗口和程序之间传递输入输出。因此说 pts/0 是“当前终端窗口”是便于理解的说法更准确地说它是这个终端窗口对应的通信通道。此时bash会显示这也符合Linux中一切皆文件而只有前台进程组才有读取写入字符文件TTY的权利TTY 和 Bash 的关系可以理解为TTY 是“输入输出通道”Bash 是“处理命令的程序”。你打开终端后系统通常会启动一个 Bash 进程并把它连接到某个 TTY例如pts/0键盘输入 → TTY → Bash → 执行命令 屏幕显示 ← TTY ← Bash 输出例如你输入lsBash 从 TTY 读取命令执行ls再把结果通过 TTY 显示到屏幕上。所以TTY 负责传递输入输出Bash 负责解析和执行命令Bash 通常运行在 TTY 上但 TTY 本身不是 Bash。2.2 什么是会话在我们用电脑使用xshell、xterminal等软件远程登录软件的时候会打开bash、新的字符文件TTY然后你会在这个终端bash下创建的新的作业这些东西的总和就是一个会话简单说会话就是“从登录终端开始到退出终端结束的一组进程和操作”。会话其实和进程组息息相关会话可以看成是⼀个或多个进程组的集合 ⼀个会话可以包含多个进程组。每⼀个会话也有⼀个会话ID(SID)其中会话的第一个进程一般是bash它的pid就是SID当然会话ID在有些地⽅也被称为会话⾸进程的进程组ID 因为会话⾸进程总是⼀个进程组的组⻓进程 所以两者是等价的2.3 关闭会话当我们关闭会话的时候bash会被杀死字符文件会被关闭那么会话内部的进程组和作业呢Linux下可能 你的前台进程可能会变成后台进程然后随其他后台进程被自动领养也可能自动关闭 但有一点是肯定的你的网络服务一定会受到用户登录或者注销的影响那么我希望让我们的网络服务是一个真正的网络服务那就必须要保证把我们的网络服务从原本的会话剥离开来自成会话2.4 创建会话守护进程是什么可以调⽤setseid函数来创建⼀个会话 前提是调⽤进程不能是⼀个进程组的组⻓。#includeunistd.h/* *功能创建会话 *返回值创建成功返回SID, 失败返回-1 */pid_tsetsid(void);该接⼝调⽤之后会发⽣调⽤进程会变成新会话的会话⾸进程。 此时 新会话中只有唯⼀的⼀个进程调⽤进程会变成进程组组⻓。 新进程组ID就是当前调⽤进程ID该进程没有控制终端。 如果在调⽤setsid之前该进程存在控制终端bash 则调⽤之后会切断联系而这些调用过setseid的进程就是 所谓的守护进程也是一种特殊的孤儿进程有时我们还称为 精灵进程daemon所以我们看到sshd后面为什么有个d现在知道了吧3. 守护进程的创建3.1 daemondaemon()是 Linux/Unix 中用于把当前进程变成“后台进程”的函数常用于编写服务程序。#includeunistd.hintdaemon(intnochdir,intnoclose);参数含义nochdir 0把当前工作目录切换为/nochdir 1保持当前工作目录不变noclose 0关闭标准输入、标准输出、标准错误并重定向到/dev/nullnoclose 1不关闭这些文件描述符。示例#includestdio.h#includeunistd.hintmain(){if(daemon(0,0)-1){perror(daemon);return1;}while(1){sleep(10);}return0;}调用成功后程序会脱离终端在后台运行关闭终端通常也不会影响它。简单说daemon()就是帮助程序“离开终端进入后台长期运行”。3.2 dev/nulldev/zero/dev/null和/dev/zero都是 Linux 中的特殊设备文件。/dev/null像“垃圾桶”写入其中的数据会被直接丢弃读取时通常读到的0【什么都读不到】。常用于隐藏输出command/dev/null21表示丢弃正常输出和错误输出。/dev/zero像“无限的零数据源”读取它会不断得到0字节。常用于生成空白数据3.3 手动实现daemon#pragmaonce#includecsignal#includefcntl.h#includeiostream#includeunistd.hvoidDaemon(){// 1.忽略可能引起程序异常退出的信号signal(SIGPIPE,SIG_IGN);signal(SIGPIPE,SIG_IGN);// 2.不能是组长if(fork()0){exit(0);}// 3.设置新会话pid_t idsetsid();(void)id;//4. 应用程序守护进程一定要有一个路径起始(一般为根目录)方便我们强制使用绝对路径方式找到所有其他相关文件或者资源//如果守护进程的当前工作目录在某个可卸载的文件系统上进程会持有该文件系统的引用// 导致umount卸载失败。调用chdir(/)将工作目录切换到根文件系统根文件系统不会被卸载释放对其他挂载点的占用保证其他分区可以正常卸载。chdir(/);// 5.在企业级开发中我们99%的调试都是靠日志和打印所以为了未来调试方便不可能删除打印程序【cout、printf】// 当我们设置新会话 fd 0、1、2都会失效 所以我们要将这些打印内容重定向// 如果只关掉 fd 1 2 3不影响运行 但是cout之类还是在报错// 重定向0、1、2intfdopen(/dev/null,O_RDWR);if(fd0){dup2(fd,0);dup2(fd,1);dup2(fd,2);close(fd);}}如果你不想重定向不想改变工作路径你还可以带一些参数进行判断和deamon一样我这里就不写
RELATED

相关推荐

第001篇 值类型与引用类型的本质区别:核心语义与边界

第001篇 值类型与引用类型的本质区别:核心语义与边界

摘要:本篇是《IOS软件开发面试从入门到精通》第 1 篇,主题为「值类型与引用类型的本质区别:核心语义与边界」。这一篇我们把「值类型与引用类型的本质区别:核心语义与边界」一次讲透:先立概念,再拆机制,最后落到工程与面试表达,一条线不绕弯。 关键词:iOS 软件开发 / …

📅 2026/9/28 4:50:53
林伽一 · AI科技周报 | 2026年09月第4周

林伽一 · AI科技周报 | 2026年09月第4周

本周 AI 技术社区最值得关注的信号,是「模型降价」与「工程降本」在同一条时间线上交汇:Anthropic 与 OpenAI 同日发布新模型并把 API 价格直降一半,NVIDIA 的 SoL-Pi 则从 harness 层把编码智能体 token 流量降低最多 49%。与此同时&#xf…

📅 2026/9/28 4:50:53
用 Python 测算组合按揭月供:公积金与商业利率的两段合成

用 Python 测算组合按揭月供:公积金与商业利率的两段合成

买深圳新房时,公积金额度往往不足以覆盖全部按揭,差额部分用商业按揭补足,这就是组合按揭。两段各自按各自利率计息,月供相加才是真实的月度支出。本文由深工优居整理组合按揭的合成口径,用 Python 写一个两段合成的测…

📅 2026/9/28 4:50:53
MORE NEWS

更多资讯

📰

YOLOv5钢轨缺陷检测工程指南:从数据到部署全流程

简介:一套基于YOLOv5的钢轨缺陷检测项目资源,面向铁路工务维护人员、计算机视觉研究者及深度学习初学者,旨在解决钢轨表面裂纹、磨损、剥离等缺陷的自动识别与分类难题。资源共有2000个文件,主要由1994个txt文本文件、3个Python脚…

📰

YOLOv5训练X光肺病数据集:从Roboflow格式到工程落地全记录

简介:面向医学影像分析与深度学习检测场景,这套X光片肺病数据集包含800张原始胸片及对应标注,覆盖细菌性肺炎、新冠病毒、正常肺、结核、病毒性肺炎五类,适合用于训练YOLOv5等目标检测模型,帮助研究者快速搭建肺病辅助…

📰

从39.7%到0%:知网AIGC检测降AI率完整实操指南

前阵子有个朋友抱着笔记本电脑来找我,说学校的预审系统给他论文标了一个数字:知网AIGC检测率39.7%。学院要求降到10%以下才能送审,他连续折腾了快两周,同义词替换、调整语序、把中文翻成英文再翻回来,能用的土办法都试…

📰

Flutter纯Dart库鸿蒙适配实践:以checkdigit校验库为例

最近把一套 Flutter 项目整体迁到鸿蒙上,过程中遇到checkdigit这个库,倒是让我对“Flutter 三方库鸿蒙化适配”这件事有了不少新认识。这个东西本身很小,就是做各类识别码校验的,ISBN、IMEI、身份证号、信用卡号、Luhn 校验码一套…

📰

支付宝手机网站支付前端怎么做图解步骤全解析

支付宝手机网站支付前端怎么做图解步骤全解析 网站做好了没人访问,这大概是很多站长和开发者最头疼的事。尤其是当你花了几万块做了个商城,结果用户到了付款环节,要么页面卡死,要么支付跳转白屏,流量全漏了。很多人搜【支付宝手机网站支付前端怎么做】,…

📰

621张田间番茄图像数据集:YOLO训练实战指南

简介:本资源是面向计算机视觉初学者与YOLO系列算法实践者的番茄目标检测专用数据集,适用于YOLOv5/v7/v8/v9/v10/v11等主流版本的模型训练、验证与测试,可直接用于农业图像识别、果实成熟度分析或轻量级端侧部署实验。压缩包共1864个文件&…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬