06进程间关系-学习笔记
Orphan Process孤儿进程
父进程先于子进程退出,子进程失去托管,这种子进程统称为孤儿进程

- 失效进程(孤儿进程):导致内存泄漏,影响新进程的创建
- 孤儿进程的危害不可预测,如果一个孤儿进程持续的申请系统资源,这导致影响系统稳定性
编写一个孤儿进程检测处理模型
getpid();
getppid();
ps aux #查看进程详细信息
ps ajx #查看进程关系
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>int main()
{pid_t pid;pid = fork();if (pid > 0){sleep(30);exit(0);}else if (pid == 0){printf("child pid = %d ,ppid = %d", getpid(), getppid());sleep(32);printf("child pid = %d ,ppid = %d", getpid(), getppid());while(1){sleep(1);}}else{}return 0;
}
孤儿进程检查
创建一个独立的check进程。父进程通过管道将自己的pid传给check进程。
process.c
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/fcntl.h>
#include <pthread.h>
#include <signal.h>
#include <sys/wait.h>int main()
{// 创建五个子进程pid_t pid;int i = 0;for (i; i < 5; i++){pid = fork();if (pid == 0)break;}// 父进程if (pid > 0){int wfd;char str_pid[10];bzero(str_pid, 10);if ((wfd = open("fifo", O_RDWR)) == -1)//两端都是RDWR权限,否则会check端会因为process端结束而发现管道关闭,出现异常。{perror("open failed");exit(0);}sprintf(str_pid, "%d", getpid());write(wfd, str_pid, strlen(str_pid));sleep(20);exit(0);wait(NULL);}else if (pid == 0){printf("child pid %d running..\n", getpid());while (1){sleep(1);}}else{perror("fork call failed");exit(0);}return 0;
}
check.c
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/fcntl.h>
#include <signal.h>
#include <errno.h>int main()
{int rfd;if ((rfd = open("fifo", O_RDWR)) == -1)//使用RDWR权限,防止写端关闭,管道权限不够而关闭{perror("打开管道失败");exit(0);}printf("open成功\n");char buf[10];bzero(buf, sizeof(buf));read(rfd, buf, sizeof(buf));pid_t pid = atoi(buf);printf("check process pid: %d ,get Parent pid: %d..\n", getpid(), pid);// 非阻塞读取管道// 1、获取文件属性int flag;fcntl(rfd, F_GETFL, &flag);flag |= O_NONBLOCK; // 设置文件属性为非阻塞fcntl(rfd, F_SETFL, flag);int len;int esrch;char str_pid[10];bzero(str_pid, 10);while ((len = read(rfd, buf, sizeof(buf))) == -1){// EAGAIN:这意味着“现在没有可用的数据,以后再试一次” 。//非阻塞返回if (errno == EAGAIN){kill(pid, 0); // 尝试杀一下这个进程if (errno == ESRCH){// 要杀的进程已经不存在了printf("check parent %d its dead\n", pid);pid -= pid * 2;// sprintf(str_pid,"%d",pid);printf("group id %d\n", pid);// 杀死孤儿进程kill(pid, 9);//函数kill比重载kill命令更合理exit(0);}printf("check parent alive\n");}else{perror("read call failed");exit(0);}sleep(1);}if (len > 0){printf("parent exit , check_process Done\n");exit(0);}return 0;
}
注意要点
- 双端访问权限都要是RDWR
- “通过尝试kill父进程,来判断父进程是否存在”,不要放在判断语句里。判断errno的值
- kill子进程组是,要使用函数而不是重载命令
进程间三种关系
亲缘关系

process Group进程组关系
-
为了方便管理系统中大量进程,设计了进程组结构,属于一种管理概念
-
进程组是由一个组长进程和多个组员进程构成、PID(Process ID)、PPID(Parent Process ID)和PGID(Process Group ID)
-
每个终端进程都是组长进程
-
组长进程标志,pid == pgid,此进程为组长进程
-
进程组的生命周期较长,与某个特定的进程无关,直到组中最后一个进程终止或转移,进程组为空时,系统释放进程组
-
根据就近原则,组长进程创建的子进程,这些子进程会归纳到父进程同组变为组员进程
-
进程组关系与亲缘关系没有必然联系,因为组成员可以转移的

-
创建进程组只有组员进程可以完成,组长无法成功
getpgrp(); //返回当前进程的pgid(组id)setpgid(pid_tpid,pid t gpid); //此函数可以创建组或转移组中进程 setpgid(getpid(),getpid()); //申请组id,创建组,只有组员进程可以成功 setpgid(getpid(0,1000); //转移进程到目标组中去 -
转移进程要保证对目标组有足够的访问权限,其次目标组要存在
process Session会话关系
-
会话关系便于终端或系统管理终端进程和终端子进程
-
会话由一个会话发起者和多个会话参与者构成
-
会话发起者退出,以进程组为单位杀死参与者
-
只杀死终端进程为首的一组进程
-
会话发起者的标志 pid == pgid == sid(会话id)
-
后续开发app时,要进行脱离控制终端,避免会话发起者bash接收,杀死应用进程
-
脱离终端:让组员进程创建新组,避免杀死
-
创建新会话脱离原有会话
getsid(getpid());//获取当前进程的会话id setsid();//当前进程创建新会话,创建新会话只有组员进程能完成,因为此函数中会进行进程组创建,如果是组长此步骤不会成功 -
终端进程无法脱离终端,必然受终端控制,因为它无法创建组也无法成立新会话
-
另一种孤儿进程——守护进程Daemon Process
孤儿进程,多进程模型中父进程异常关闭,导致子进程失去托管,这类进程为孤儿进程。
开发者关闭其父进程,让子进程脱离终端控制,此进程工作于后台,周期执行,这类进程称为守护进程(也是孤儿)
守护进程(也叫精灵进程)和普通进程的差异性
-
守护进程的生命周期比普通进程长,守护进程的生命周期随操作系统持续,开机自动启动,关机则关闭
-
守护进程为主程序提供服务和支持,保证主程序的稳定性
-
守护进程不允许参与前台任务,也不允许将数据打印到前台
-
低效模式运行,不允许占用大量系统资源
守护进程执行的三种模式
- 间隔执行
- 定时执行
- 条件触发
shell脚本实现开机启动
守护进程的开发流程
-
重定向STD_FILENO

-
造孤儿——父进程创建子进程、父进程退出
-
子进程脱离控制终端,创建新会话
-
关闭前台描述符STDIN_FILENO,STDOUT_FILENO,
- STD_FILENO默认是perror(“xxx call faild”) 标准错误是占用标准输出的,会将异常信息显示在终端上(前台)
- 为了避免错误信息抛出到前台,可以采用重定向的方式,将错误信息抛出到文件中
-
修改进程的工作目录为根目录
默认情况下进程的工作目录,是程序所在位置,进程访问文件,访问磁盘信息都是以工作目录为基准
-
修改进程的Umask掩码,为0002
-
执行守护进程任务
-
守护进程的退出处理
demo,编写一个守护进程,后台执行,开机启动,每间隔3s向time.log中写入系统时间
相关文章:
06进程间关系-学习笔记
Orphan Process孤儿进程 父进程先于子进程退出,子进程失去托管,这种子进程统称为孤儿进程 失效进程(孤儿进程):导致内存泄漏,影响新进程的创建孤儿进程的危害不可预测,如果一个孤儿进程持续的申…...
Vue的动画方式有几种
Vue的动画方式有几种? Vue的动画方式主要分成两大类,一类是CSS动画,一类是JS动画 CSS动画中包含transition以及animation,但在Vue中只需要通过transition封装组件实现。 CSS动画的类名主要包括:v-enter、v-enter-acti…...
PyTorch: 基于【VGG16】处理MNIST数据集的图像分类任务【准确率98.9%+】
目录 引言在Conda虚拟环境下安装pytorch步骤一:利用代码自动下载mnist数据集步骤二:搭建基于VGG16的图像分类模型步骤三:训练模型步骤四:测试模型运行结果后续模型的优化和改进建议完整代码结束语 引言 在本博客中,小…...
【lombok】从easyExcel read不到值到cglib @Accessors(chain = true)隐藏的大坑
背景: 在一次使用easyExcel.read 读取excel时,发现实体类字段没有值,在反复测试后,发现去掉Accessors(chain true)就正常了,为了验证原因,进行了一次代码跟踪 由于调用链路特别长,只列举出部分代码&#x…...
1-SaaS通识
云计算 讲SaaS必须先讲云计算。云计算通过互联网提供计算服务,包括服务器、存储、数据库、网络、应用等,采用按需付费的定价模式。 云计算的4种部署模式 公有云:由云服务商拥有和管理,就好比水电,居民共享ÿ…...
Spring Boot实现接口幂等
Spring Boot实现接口幂等 1、pom依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http:…...
ShopsN commentUpload 文件上传漏洞复现
0x01 产品简介 ShopsN 是一款符合企业级商用标准全功能的真正允许免费商业用途的开源网店全网系统。 0x02 漏洞概述 ShopsN commentUpload 接口处存在任意文件上传漏洞,攻击者可以利用文件上传漏洞执行恶意代码、写入后门、读取敏感文件,从而可能导致服务器受到攻击并被控…...
【Qt5】ui文件最后会变成头文件
2023年12月14日,周四下午 我也是今天下午偶然间发现这个的 在使用Qt的uic(User Interface Compiler)工具编译ui文件时,会生成对应的头文件。 在Qt中,ui文件是用于描述用户界面的XML文件,而头文件是用于在…...
数组笔试题解析(下)
数组面试题解析 字符数组 (一) 我们上一篇文章学习了一维数组的面试题解析内容和字符数组的部分内容,我们这篇文章讲解一下字符数组和指针剩余面试题的解析内容,那现在,我们开始吧。 我们继续看一组字符数组的面试…...
PPT插件-好用的插件-图形缩放-大珩助手
图形缩放 包括适合屏幕、适合宽度、适合高度、水平翻转、垂直翻转、指定角度,可同时对多个形状进行操作 适合屏幕 一键设置图像、文本、形状的长宽尺寸与当前幻灯片一致 适合宽度 一键设置图像、文本、形状的宽度尺寸与当前幻灯片一致 适合高度 一键设置图像…...
五:爬虫-数据解析之xpath解析
五:数据解析之xpath解析 1.xpath介绍: xpath是XML路径语言,它可以用来确定xml文档中的元素位置,通过元素路径来完成对元素的查找,HTML就是XML的一种实现方式,所以xpath是一种非常强大的定位方式 XPa…...
什么是Laravel?它有哪些特性?
Laravel 是一款流行的 PHP Web 框架,设计用于构建现代、优雅且功能强大的 Web 应用程序。它提供了一套丰富的工具和库,以简化常见的开发任务,同时保持灵活性和可扩展性。以下是 Laravel 框架的一些主要特性: 优雅的语法࿱…...
[足式机器人]Part2 Dr. CAN学习笔记-自动控制原理Ch1-3燃烧卡路里-系统分析实例
本文仅供学习使用 本文参考: B站:DR_CAN Dr. CAN学习笔记-自动控制原理Ch1-3燃烧卡路里-系统分析实例 1. 数学模型2. 比例控制 Proprotional Control 1. 数学模型 2. 比例控制 Proprotional Control...
安恒明御安全网关 aaa_local_web_preview文件上传漏洞复现
0x01 产品简介 明御安全网关秉持安全可视、简单有效的理念,以资产为视角,构建全流程防御的下一代安全防护体系,并融合传统防火墙、入侵检测、入侵防御系统、防病毒网关、上网行为管控、VPN网关、威胁情报等安全模块于一体的智慧化安全网关。 0x02 漏洞概述 明御安全网关在…...
基于ssm企业人事管理系统的设计与实现论文
摘 要 进入信息时代以来,很多数据都需要配套软件协助处理,这样可以解决传统方式带来的管理困扰。比如耗时长,成本高,维护数据困难,数据易丢失等缺点。本次使用数据库工具MySQL和编程技术SSM开发的企业人事管理系统&am…...
你知道为什么要加 final 关键字了吗?
嗨,大家好,欢迎来到程序猿漠然公众号,我是漠然。 在Java编程中,我们经常会遇到需要使用final关键字的情况。那么,为什么要使用final关键字呢?它到底有什么作用?本文将从以下几个方面来详细…...
找不到mfc100u.dll,程序无法继续执行?三步即可搞定
在使用电脑过程中,我们经常会遇到一些错误提示,其中之一就是“找不到mfc100u.dll”。mfc100u.dll是Microsoft Foundation Class(MFC)库中的一个版本特定的DLL文件。MFC是微软公司为简化Windows应用程序开发而提供的一套C类库。它包…...
postman接口测试之Postman配置环境变量和全局变量
前言 我们在测试的过程中,遇到最多的问题也可以是环境的问题了吧,今天开发用了这个测试环境,明天又换了另一个测试环境,这样对于我们测试非常的麻烦,特别最接口的时候需要来回的输入环境地址比较麻烦,今天…...
OpenSSL 编程示例
参考:深入探索 OpenSSL:概念、原理、开发步骤、使用方法、使用场景及代码示例 地址:https://oneisall.blog.csdn.net/article/details/131489812?spm1001.2014.3001.5502 目录 1. OpenSSL 概念2. OpenSSL 原理3. OpenSSL 开发步骤4. OpenSSL…...
K8S学习指南(17)-k8s核心对象CronJob
文章目录 前言什么是CronJob?示例演示步骤1:创建CronJob步骤2:定义任务模板步骤3:部署CronJob步骤4:监视CronJob的执行 总结 前言 Kubernetes(简称K8s)是一种用于自动部署、扩展和管理容器化应…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...
从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...
MyBatis中关于缓存的理解
MyBatis缓存 MyBatis系统当中默认定义两级缓存:一级缓存、二级缓存 默认情况下,只有一级缓存开启(sqlSession级别的缓存)二级缓存需要手动开启配置,需要局域namespace级别的缓存 一级缓存(本地缓存&#…...
Linux-进程间的通信
1、IPC: Inter Process Communication(进程间通信): 由于每个进程在操作系统中有独立的地址空间,它们不能像线程那样直接访问彼此的内存,所以必须通过某种方式进行通信。 常见的 IPC 方式包括&#…...
LUA+Reids实现库存秒杀预扣减 记录流水 以及自己的思考
目录 lua脚本 记录流水 记录流水的作用 流水什么时候删除 我们在做库存扣减的时候,显示基于Lua脚本和Redis实现的预扣减 这样可以在秒杀扣减的时候保证操作的原子性和高效性 lua脚本 // ... 已有代码 ...Overridepublic InventoryResponse decrease(Inventor…...
