06进程间关系-学习笔记

Orphan Process孤儿进程

父进程先于子进程退出,子进程失去托管,这种子进程统称为孤儿进程

1689386920798.png

  • 失效进程(孤儿进程):导致内存泄漏,影响新进程的创建
  • 孤儿进程的危害不可预测,如果一个孤儿进程持续的申请系统资源,这导致影响系统稳定性

编写一个孤儿进程检测处理模型

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;
}

孤儿进程检查

1689390600443.png

创建一个独立的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;
}

注意要点

  1. 双端访问权限都要是RDWR
  2. “通过尝试kill父进程,来判断父进程是否存在”,不要放在判断语句里。判断errno的值
  3. kill子进程组是,要使用函数而不是重载命令

进程间三种关系

亲缘关系

1694342400535.png

process Group进程组关系

  • 为了方便管理系统中大量进程,设计了进程组结构,属于一种管理概念

  • 进程组是由一个组长进程和多个组员进程构成、PID(Process ID)、PPID(Parent Process ID)和PGID(Process Group ID)

  • 每个终端进程都是组长进程

  • 组长进程标志,pid == pgid,此进程为组长进程

  • 进程组的生命周期较长,与某个特定的进程无关,直到组中最后一个进程终止或转移,进程组为空时,系统释放进程组

  • 根据就近原则,组长进程创建的子进程,这些子进程会归纳到父进程同组变为组员进程

  • 进程组关系与亲缘关系没有必然联系,因为组成员可以转移的

1694342543561.png

  • 创建进程组只有组员进程可以完成,组长无法成功

    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

孤儿进程,多进程模型中父进程异常关闭,导致子进程失去托管,这类进程为孤儿进程。
开发者关闭其父进程,让子进程脱离终端控制,此进程工作于后台,周期执行,这类进程称为守护进程(也是孤儿)

守护进程(也叫精灵进程)和普通进程的差异性

  1. 守护进程的生命周期比普通进程长,守护进程的生命周期随操作系统持续,开机自动启动,关机则关闭

  2. 守护进程为主程序提供服务和支持,保证主程序的稳定性

  3. 守护进程不允许参与前台任务,也不允许将数据打印到前台

  4. 低效模式运行,不允许占用大量系统资源

守护进程执行的三种模式

  1. 间隔执行
  2. 定时执行
  3. 条件触发

shell脚本实现开机启动

守护进程的开发流程

  1. 重定向STD_FILENO1694770649395.png

  2. 造孤儿——父进程创建子进程、父进程退出

  3. 子进程脱离控制终端,创建新会话

  4. 关闭前台描述符STDIN_FILENO,STDOUT_FILENO,

    1. STD_FILENO默认是perror(“xxx call faild”) 标准错误是占用标准输出的,会将异常信息显示在终端上(前台)
    2. 为了避免错误信息抛出到前台,可以采用重定向的方式,将错误信息抛出到文件中
  5. 修改进程的工作目录为根目录

    默认情况下进程的工作目录,是程序所在位置,进程访问文件,访问磁盘信息都是以工作目录为基准

  6. 修改进程的Umask掩码,为0002

  7. 执行守护进程任务

  8. 守护进程的退出处理

demo,编写一个守护进程,后台执行,开机启动,每间隔3s向time.log中写入系统时间

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/220987.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

汽车标定技术(十三)--标定概念再详解

目录 1.概述 2.基于Flash的标定 3.基于RAM的标定 4.AUTOSAR基于指针标定概念

AWS Ubuntu设置DNS解析(解决resolve.conf被覆盖问题)

众所周知&#xff1a; Ubuntu在域名解析时&#xff0c;最直接使用的是/etc/resolve.conf文件&#xff0c;它是/run/systemd/resolve/resolve.conf的软链接&#xff0c;而对于刚装完的ubuntu系统&#xff0c;该文件的内容如下 ubuntuip-172-31-36-184:/etc$ cat resolv.conf #…

【软考】-- 信息系统项目管理师(高级)历年论文题目

考试年度 试题一 试题二 2023年下11.05 资源管理 2023年下11.04 合同管理 2023年下10.29 工作绩效域 2023年下10.28 干系人管理 2023年上 风险管理 2022年下 质量管理 2022年上 干系人管理 2021年上 范围管理 合同管理 2020年下 成本管理 采购管理 2019…

计算机毕业设计 SpringBoot的医院门诊在线挂号系统 Javaweb项目 Java实战项目 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

D28|买卖股票的最佳时机+跳跃游戏

122.买卖股票的最佳时机 II 初始思路&#xff1a; 这道题解题的时候比较像在找规律&#xff0c;发现只要计算这个过程中的两数之差然后相加即可。 题解复盘&#xff1a; 可以更加清晰的发现如何从题意中获得贪心的思路。 如何贪心&#xff1a;局部最优&#xff1a;收集每天的…

CentOS 7 部署pure-ftp

文章目录 &#xff08;1&#xff09;简介&#xff08;2&#xff09;准备工作&#xff08;3&#xff09;更新系统&#xff08;4&#xff09;安装依赖环境&#xff08;5&#xff09;下载和解压pure-ftp源码包&#xff08;6&#xff09;编译和安装pure-ftp&#xff08;7&#xff0…

01读《物联网安全研究综述:威胁、检测与防御》随笔

01读《物联网安全研究综述&#xff1a;威胁、检测与防御》随笔 摘要3 研究现状3.1 安全威胁3.1.1 云平台访问控制缺陷3.1.2 云平台恶意应用3.1.3 云平台实体和应用交互漏洞3.1.4 通信协议漏洞3.1.5 通信流量侧信道信息泄露3.1.6 设备固件漏洞3.1.7 基于语音信道的攻击3.1.8 基于…

大学老师职称怎么评定

作为一名大学老师&#xff0c;想要在职业生涯中更上一层楼&#xff0c;评定职称是不可避免的一步。那么&#xff0c;如何评定大学老师的职称呢&#xff1f;下面我来给大家分享几点建议。 了解评职称的基本条件。不同高校、不同学科的职称评定条件可能会有所不同&#xff0c;因此…

N通道沟槽电源 场效应管 FMB30H100SL

亿胜盈科FMB30H100SL是一款N通道沟槽电源的场效应管&#xff08;MOS管&#xff09;&#xff0c;FMB30H100SL封装为&#xff1a;TOLL4-6R。

智能优化算法应用:基于树种算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于树种算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于树种算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.树种算法4.实验参数设定5.算法结果6.参考文献7.MA…

Windows环境使用Minio如此简单

Windows环境使用Minio如此简单 Windows环境下使用Minio对象存储真的好简单1、下载及安装1.1、运行1.2、配置1.2.1、创建桶 1.3、Minio支持多种语言的SDK1.3.1、Java中使用 Windows环境下使用Minio对象存储真的好简单 很久很久以前&#xff0c;开发个Web程序&#xff0c;上传文…

理德名人故事:金融大王——贾尼尼

一个人的职业选择和成长道路会受到很多因素的影响。贾尼尼&#xff0c;这位美国第三大银行——美洲银行的创始人&#xff0c;他的银行家之路却与父亲的死有关。 1878年的一天&#xff0c;贾尼尼8岁的时候&#xff0c;同村的一个葡萄农&#xff0c;因为还不起向贾尼尼父亲借的一…

MuMu模拟器12如何连接adb?

一、MuMu模拟器12端口查看 MuMu模拟器12现已支持adb同时连接多个模拟器进行调试的操作&#xff0c;可以参考以下步骤操作&#xff0c;查看MuMu模拟器12本体以及多开模拟器的adb端口&#xff1a; 单开的MUMU模拟器12可通过模拟器右上角菜单-问题诊断&#xff0c;获取ADB调试端…

bind、call、apply 区别?

作用 call、apply、bind作用是改变函数执行时的上下文&#xff0c;简而言之就是改变函数运行时的this指向 那么什么情况下需要改变this的指向呢&#xff1f; 下面举个例子 var name "lucy"; var obj {name: "martin",say: function () {console.log(…

TikTok科技趋势:平台如何引领数字社交革命?

TikTok作为一款颠覆性的短视频应用&#xff0c;不仅改变了用户的娱乐方式&#xff0c;更在数字社交领域引领了一场革命。本文将深入探讨TikTok在科技趋势方面的引领作用&#xff0c;分析其在数字社交革命中的关键角色&#xff0c;以及通过技术创新如何不断满足用户需求&#xf…

实现树形结构的插件vue-tree-color及元素放大缩小拖动

实现流程图,借鉴vue-tree-color 引入依赖 npm install vue-tree-color 同时查看项目中是否已安装less和less-loader,因为该组件使用到less npm install --save-dev less less-loader 如果这里启动项目报错,有可能是less和less-loader的版本过高,可以降低版本,或者指定版本号…

【面试】数据库—优化—如何定位慢查询

数据库—优化—如何定位慢查询 1. 出现慢查询的情况&#xff08;表象&#xff1a;页面加载过慢、接口压测响应时间过长&#xff08;超过1s&#xff09;&#xff09;&#xff1a; 聚合查询多表查询表数据量过大查询深度分页查询 2. 如何定位慢查询 方案一&#xff1a;开源工具…

OpenHarmony 鸿蒙系统之开发环境安装

一、首先在下方链接网址中下载DevEco Studio的安装包。 DevEco Studio历史版本下载-HarmonyOS应用开发官网

[字符串操作]挑选最大值序列

挑选最大值序列 题目描述 给出了若干行非负整数序列&#xff0c;请选择最大值所在的序列&#xff0c;按输入原样输出该序列。如果最大值出现在多个序列&#xff0c;则只输出最大值最后出现的序列。 假设&#xff1a;每个序列中至少有1个整数&#xff0c;至多300个整数&#x…

可替代LM5145,5.5V-100V Vin同步降压控制器_SCT82A30

SCT82A30是一款100V电压模式控制同步降压控制器&#xff0c;具有线路前馈。40ns受控高压侧MOSFET的最小导通时间支持高转换比&#xff0c;实现从48V输入到低压轨的直接降压转换&#xff0c;降低了系统复杂性和解决方案成本。如果需要&#xff0c;在低至6V的输入电压下降期间&am…