进程等待进程程序替换

在之前的进程状态一文中我们初步了解到了僵尸进程,我们都知道僵尸进程是一个已经运行完毕但然仍占用内存资源的进程,它的存在会浪费系统资源,我们必须想方设法将僵尸进程清理掉。

先来想一下为什么会存在僵尸进程,一个进程的回收是由它的父进程来进行检验回收的,但是当父进程正在处理自己的任务而无暇顾及子进程的情况时就会暂时搁置子进程,而如果此时子进程运行完毕,被搁置的状态就是僵尸状态。

因此一般我们需要让父进程进行等待操作,检验子进程的完成情况,能够将运行完毕的子进程快速回收。这个操作叫做进程等待

Linux下给我们提供了两个系统调用,wait和waitpid,其中wait是waitpid的一个子集,相比之下我们更常用waitpid

wait:

参数只有一个输出型参数status,如果不关心status的结果,可以再调用wait时传入NULL
此系统调用为阻塞等待,即子进程运行完毕后才继续执行父进程

status:
status的二进制形式的低16位存储了退出码和信号信息,当我们想要通过status读取一个进程的退出码或信号时可以通过对status的位运算来获取
在这里插入图片描述
为了方便获取,Linux为我们提供了多个宏函数来辅助读取。

WIFEXITED(status): 若为正常终止子进程返回的状态,则为真。(查看进程是否是正常退出)
WEXITSTATUS(status): 若WIFEXITED非零,提取子进程退出码。(查看进程的退出码)

waitpid:

第一个参数为要等待的子进程id(-1标识所有子进程),第二参数为为输出型参数status,第三个参数为选项

当id=-1,option=0时waitpid就特化成了wait(阻塞等待),但是有时候我们想要让父进程等待子进程的同时能够处理自己的任务,我们就需要进行非阻塞等待,只需要把option参数改为WNOHANG即可

实例:👇

#include <stdio.h>
#include <unistd.h>
#include <sys/type.h>
#include <sys/wait.h>int main(){pid_t id=fork()//创建子进程if(id<0){perror("fork fail");exit(1);}else if(id==0){printf("I an child progress\n");sleep(3);}else{int status=0;printf("I am father progress\n");pid_t ret=waitpid(-1,&status,0);//等价于wait(&status)//pid_t ret=waitpid(-1,&status,WNOHANG); 非阻塞等待return 0;
}
//wait和waitpid的返回值为等待成功的子进程id

(waitpid如果等待失败立即出错返回,waitpid如果返回0则表示所等待的子进程仍处于运行状态未退出,父进程先处理自己的任务,进行下一次等待,所以如果我们进行非阻塞等待,通常会将waitpid放在一个循环体里)

(如果waitpid等待成功,并且第一个参数是-1,那么返回值是任意一个子进程的id)

进程程序替换:

绝大多数情况下父进程创建子进程的目的是让子进程处理与父进程不同的任务,那么就需要子进程有自己代码文件。

在子进程创建伊始,常量数据和代码段会和子进程共享,需要修改的数据会发生写时拷贝到自己的地址空间中,一旦进程替换,老旧的数据会被清理,被新的数据所替代。

因此可以确定的是进程替换不会产生新的进程,而只是改变了进程所对应的代码数据

Linux为我们提供了一execl系列的函数用于进行替换,具体使用可以参考标准文档。

实例:

int main(){printf("progress begin!\n");execl(…………);printf("progress end!\n");return 0;
}

运行上述代码片段,*progress end!*可能能打印,也可能不会打印,分别对印了进程替换成功和失败。

倘若进程替换成功,那么execl以后的代码数据就不再有任何意义了,因为此时进程对应的代码已经是别的代码。

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

pytest如何在类的方法之间共享变量?

在pytest中&#xff0c;setup_class是一个特殊的方法&#xff0c;它用于在类级别的测试开始之前设置一些初始化的状态。这个方法会在类中的任何测试方法执行之前只运行一次。 当你在setup_class中使用self来修改类属性时&#xff0c;你实际上是在修改类的一个实例属性。在Pyth…

人工智能 — 相机模型和镜头畸变

目录 一、相机模型1、相机与图像2、坐标系1、世界坐标系2、相机坐标系3、图像物理坐标系4、图像像素坐标系 3、相机成像4、世界坐标系到摄像机坐标系5、欧氏变换6、齐次坐标7、摄像机坐标系到图像物理坐标系8、图像物理坐标系到图像像素坐标系9、摄像机坐标系到图像像素坐标系1…

Webserver解决segmentation fault(core dump)段错问问题

前言 在完成了整个项目后&#xff0c;我用make命令编译了server&#xff0c;当我运行./server文件时&#xff0c;出现了段错误 在大量的代码中找出错因并不是一件容易的事&#xff0c;尤其是对新手程序员来说。而寻找bug的过程就像是侦探调查线索追查凶手一样&#xff0c;我们…

皓学IT:WEB05-Servlet

一、Servlet 1.1.概述 Servlet是SUN公司提供的一套规范&#xff0c;名称就叫Servlet规范&#xff0c;它也是JavaEE规范之一。我们可以像学习Java基础一样&#xff0c;通过API来学习Servlet。这里需要注意的是&#xff0c;在我们之前JDK的API中是没有Servlet规范的相关内容&am…

模型 金字塔原理

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_总纲目录。清晰逻辑&#xff0c;有效沟通。 1 金字塔原理的应用 1.1 应用金字塔原理提出一个新产品的市场推广策略 确认结论&#xff1a;我们应该采取在线社交媒体广告和口碑营销的策略来推广新产品。 构建层级1&…

使用apt-mirror做一个本地ubuntu离线apt源

1. 安装 apt-mirror sudo apt-get install apt-mirror2. 创建文件夹 mkdir ./apt_mirror_dir3. 修改apt-mirror的配置文件 sudo gedit /etc/apt/mirror.list得到以下文件,重点对两个位置进行修改&#xff1a; ############# config ################## # ## 修改1&#xff…

基于Clion+stm32cubemx+rt-thread os进行环境搭建

前言 RT-Thread文档中心Clion开发STM32的环境搭建,请参考之前的文章本次使用的芯片为STM32F407VET6,其他芯片相似.项目创建 使用STM32CubeMx快速生成项目工程,此步骤的话可以参考官方文档 基础配置如下

BoomWorks使用wxWidgets+CodeBlocks+GCC开发的软件合集

♦️ 定时执行专家&#xff08;TimingExecutor&#xff09; V7.0 《定时执行专家》是一款制作精良、功能强大、毫秒精度、专业级的定时任务执行软件。软件具有 25 种【任务类型】、12 种【触发器】触发方式&#xff0c;并且全面支持界面化【Cron表达式】设置。软件采用多线程并…

AI 绘画:人工智能绘画之美

人工智能&#xff08;AI&#xff09;是当今科技领域的热门话题&#xff0c;它不仅可以帮助我们解决各种复杂的问题&#xff0c;还可以创造出令人惊叹的艺术作品。AI 绘画是一种利用 AI 技术生成图像的方法&#xff0c;它可以模仿不同的风格、主题和技巧&#xff0c;甚至可以创造…

idea集成git(实用篇)

0.Git常用命令 Git常用命令-CSDN博客 1.下载git Git - Downloads 一路傻瓜式安装即可&#xff08;NEXT&#xff09; 2.软件测试 在Windows桌面空白处&#xff0c;点击鼠标右键&#xff0c;弹出右键菜单 Git软件安装后&#xff0c;会在右键菜单中增加两个菜单 Git GUI He…

【PyQt5桌面应用开发】3.Qt Designer快速入门(控件详解)

一、Qt Designer简介 Qt Designer是PyQt程序UI界面的实现工具&#xff0c;可以帮助我们快速开发 PyQt 程序的速度。它生成的 UI 界面是一个后缀为 .ui 的文件&#xff0c;可以通过 pyiuc 转换为 .py 文件。 Qt Designer工具使用简单&#xff0c;可以通过拖拽和点击完成复杂界面…

仿12306校招项目业务三(用户注册)

用户表结构 原本的表结构如下 由于用户量大&#xff0c;采用分库分表&#xff1a; 分库分表设计 根据系统设计的假设&#xff0c;12306 的注册用户规模约为 10 亿&#xff0c;每年新增用户约 1000 万。在用户数据分库或分表之前&#xff0c;我们需要先考虑拆分成多少个库或表…

力扣模板题:回文链表

请牢记检测回文串的模板 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ bool isPalindrome(struct ListNode* head) {int size0;struct ListNode* pointhead;while(point){size;pointpoint->next;}int arr…

Mac使用K6工具压测WebSocket

commend空格 打开终端&#xff0c;安装k6 brew install k6验证是否安装成功 k6 version设置日志级别为debug export K6_LOG_LEVELdebug执行脚本&#xff08;进入脚本所在文件夹下&#xff09; k6 run --vus 100 --duration 10m --out csvresult.csv script.js 脚本解释&…

[AutoSar]BSW_Com03 DBC详解 (二)

目录 关键词平台说明一、前言二、DBC Attributes2.1 添加方法2.2 GenMsgCycleTime2.3 GenMsgSendType2.4 GenSigStartValue 三、DBC Attributes 对照表 关键词 嵌入式、C语言、autosar、OS、BSW 平台说明 项目ValueOSautosar OSautosar厂商vector &#xff0c;芯片厂商TI 英…

vim恢复.swp [BJDCTF2020]Cookie is so stable1

打开题目 扫描目录得到 关于 .swp 文件 .swp 文件一般是 vim 编辑器在编辑文件时产生的&#xff0c;当用 vim 编辑器编辑文件时就会产生&#xff0c;正常退出时 .swp 文件被删除&#xff0c;但是如果直接叉掉&#xff08;非正常退出&#xff09;&#xff0c;那么 .swp 文件就会…

select a,b,c from 表 where b=1 and c=1; abc是联合索引,这样查询会命中索引吗?

如果select 只显示索引列 那么会命中索引 如果select * 那么不会走索引&#xff0c;会查全表

介绍 PIL+IPython.display+mtcnn for 音视频读取、标注

1. nn.NLLLoss是如何计算误差的? nn.NLLLoss是负对数似然损失函数&#xff0c;用于多分类问题中。它的计算方式如下&#xff1a;首先&#xff0c;对于每个样本&#xff0c;我们需要将其预测结果通过softmax函数转换为概率分布。softmax函数可以将一个向量映射为一个概率分布&…

力扣LCR 140. 训练计划 II(顺序遍历,快慢指针)

Problem: LCR 140. 训练计划 II 文章目录 题目描述思路复杂度Code 题目描述 思路 思路1&#xff1a;顺序遍历 欲返回倒数第cnt个节点则需要顺序遍历到len-cnt&#xff08;其中len为链表的长度&#xff09; 思路2&#xff1a;快慢指针 让一个快指针fast指向cnt 1个节点&#x…

2024022502-数据库绪论

数据库绪论 数据管理的三个阶段 人工管理阶段 文件系统阶段 数据库系统阶段 基本术语 数据&#xff08;Data&#xff09; 计算机用来描述事物的记录&#xff08;文字&#xff0e;图形&#xff0e;图像&#xff0e;声音&#xff09;数据的形式本身并不能完全表达其内容&am…