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)是一种用于自动部署、扩展和管理容器化应…...
单片机Freertos入门(二)任务调度的介绍
简介: FreeRTOS支持的任务调度方法有抢占式、协作式、时间片轮转,下面分别来讲解。 1.抢占式调度 抢占式调度,是最高优先级的任务一旦就绪,总能得到CPU的执行权。 高优先级运行时候,低优先级不运行,等待…...
QT----自定义信号和槽
第二天 2.1自定义信号和槽 新建一个Qtclass 自定义信号:返回值是void ,只需要声明,不需要实现,可以有参数,可以重载 自定义槽:返回值void ,需要声明,也需要实现,可以有…...
【Vue第4章】Vue中的ajax_Vue2
目录 4.1 解决开发环境Ajax跨域问题 4.1.1 解决跨域的三种方法 4.1.2 使用代理服务器 4.1.3 笔记与代码 4.1.3.1 笔记 4.1.3.2 19_src_配置代理服务器 4.2 github用户搜索案例 4.2.1 效果 4.2.2 接口地址 4.2.3 笔记与代码 4.2.3.1 20_src_github搜索案例 4.3 vue项…...
力扣labuladong——一刷day72
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、力扣109. 有序链表转换二叉搜索树二、力扣1382. 将二叉搜索树变平衡 前言 二叉树的递归分为「遍历」和「分解问题」两种思维模式,这道题需要用到…...
Leetcode—509.斐波那契数【简单】
2023每日刷题(五十七) Leetcode—509.斐波那契数 实现代码 int fib(int n){if(n 0) {return 0;}if(n 1) {return 1;}return fib(n-1) fib(n-2); }运行结果 之后我会持续更新,如果喜欢我的文章,请记得一键三连哦,点…...
山峰个数 - 华为OD统一考试
OD统一考试 分值: 100分 题解: Java / Python / C++ 题目描述 给定一个数组,数组中的每个元素代表该位置的海拔高度。0表示平地,>=1时表示属于某个山峰,山峰的定义为当某个位置的左右海拔均小于自己的海拔时,该位置为山峰。数组起始位置计算时可只满足一边的条件。 …...
38、池化的特征不变性
池化操作有一个比较独特的特性,叫作特征不变性。 很多文章中是这么描述池化的特征不变性的:池化操作的特征不变性,可以提高模型对图片平移、缩放和旋转等变换的鲁棒性。 之前看到这句话的时候,似懂非懂。后来查了一些资料&#…...
051:vue项目webpack打包后查看各个文件大小
第051个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下,本专栏提供行之有效的源代码示例和信息点介绍,做到灵活运用。 (1)提供vue2的一些基本操作:安装、引用,模板使…...
JVM调优:参数(学习笔记)
一、jvm的运行参数 标准参数 -help、-version、-D参数 jvm的标准参数,一般都是很稳定的,在未来的JVM版本中不会改变,可以使用java -help 检索出所有的标准参数。 通过以下命令查看: 命令:java -help 可以看到我们经常…...
MVC Gantt Wrapper:RadiantQ jQuery
The RadiantQ jQuery Gantt Package includes fully functional native MVC Wrappers that let you declaratively and seamlessly configure the Gantt component within your aspx or cshtm pages just like any other MVC extensions. 如果您还没有准备好转向完全基于客户端…...
网站建设的cms系统/seo工作流程图
PowerBI 十一月的更新终于有了一个解决密集恐惧症患者的方法,建模视图每个tab专注于一个领域,更加简洁。 ps: Microstrategy早就有了。 转载于:https://www.cnblogs.com/lizardbi/p/DAX-PATTERN-POWERBI-ModellingView.html...
深圳精品网站建设/外贸营销网站建设介绍
python图像处理单通道、多通道图像读取单通道图三通道图通道分离与转换通道分离与合并颜色空间转换图像拼接与几何变换拼接几何变换缩放图片翻转图片平移图片图像二值化处理阈值分割图像归一化处理单通道、多通道图像读取 单通道图 俗称灰度图,每个像素点只能有有…...
安装网站源码/综合型b2b电子商务平台网站
职场一分钱一分货 人家拿高薪,不是全靠运气 工作年限越久,不代表越值钱 一年经验用了五年,无法改变 因为经历不等于经验 加班“重灾区”的互联网行业以996闻名,每天超过11小时的工作时长每年位居各行业之首。 工作内容重复&…...
网站流量如何赚钱/刷百度关键词排名优化
1、引用和指针的区别:引用是别名。必须和具体的对象绑定,在声明的时候初始化,以后不能改变绑定关系;引用不能声明为null类型;指针是一种变量,它的值为地址,在使用的时候可以改变,也可…...
景安网站备案要多久/湖南专业的关键词优化
2016-05-31 回答实现两个mysql数据库之间同步同步原理:mysql 为了实现replication 必须打开bin-log 项,也是打开二进制的mysql 日志记录选项。mysql 的bin log 二进制日志,可以记录所有影响到数据库表中存储记录内容的sql 操作,如…...
wordpress博客修改/免费个人自助建站
对于oracle日志组来说,每组日志最少一个成员,如果这个成员被破坏了会导致整个日志组都不可以被访问了,在数据库启动还有数据库要访问这组日志的时候会失败。为了避免这种情况要保证每组日志成员至少两个以上,不同的成员要放在不同…...