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)是一种用于自动部署、扩展和管理容器化应…...
XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...
解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用
在工业制造领域,无损检测(NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统,以非接触式光学麦克风技术为核心,打破传统检测瓶颈,为半导体、航空航天、汽车制造等行业提供了高灵敏…...
AxureRP-Pro-Beta-Setup_114413.exe (6.0.0.2887)
Name:3ddown Serial:FiCGEezgdGoYILo8U/2MFyCWj0jZoJc/sziRRj2/ENvtEq7w1RH97k5MWctqVHA 注册用户名:Axure 序列号:8t3Yk/zu4cX601/seX6wBZgYRVj/lkC2PICCdO4sFKCCLx8mcCnccoylVb40lP...
STM32标准库-ADC数模转换器
文章目录 一、ADC1.1简介1. 2逐次逼近型ADC1.3ADC框图1.4ADC基本结构1.4.1 信号 “上车点”:输入模块(GPIO、温度、V_REFINT)1.4.2 信号 “调度站”:多路开关1.4.3 信号 “加工厂”:ADC 转换器(规则组 注入…...
写一个shell脚本,把局域网内,把能ping通的IP和不能ping通的IP分类,并保存到两个文本文件里
写一个shell脚本,把局域网内,把能ping通的IP和不能ping通的IP分类,并保存到两个文本文件里 脚本1 #!/bin/bash #定义变量 ip10.1.1 #循环去ping主机的IP for ((i1;i<10;i)) doping -c1 $ip.$i &>/dev/null[ $? -eq 0 ] &&am…...
拟合问题处理
在机器学习中,核心任务通常围绕模型训练和性能提升展开,但你提到的 “优化训练数据解决过拟合” 和 “提升泛化性能解决欠拟合” 需要结合更准确的概念进行梳理。以下是对机器学习核心任务的系统复习和修正: 一、机器学习的核心任务框架 机…...
