「Linux」进程等待与替换

在这里插入图片描述

💻文章目录

  • 📄前言
  • 进程等待
    • 进程等待的概念
    • 进程等待的方法
  • 进程替换
    • 进程替换的概念
    • 替换方式
  • 📓总结


📄前言

在如今的时代,多进程编程已经变成了必不可少的一部分,而进程等待、进程替换这两个概念都是作为多进程编程所必不可少的知识,为了掌握多进程编程,今天就从进程等待与替换开始吧。

进程等待

进程等待的概念

我们知道linux中进程拥有多种状态,例如僵尸状态、阻塞状态、运行状态等,而其中僵尸状态就是因为父进程没有接受到子进程的退出码而导致的状态,僵尸状态意味着系统无法对进程pcb的资源进行回收,过多的僵尸程序将导致系统内存泄漏、反应卡顿,严重时甚至会让系统挂死。所以,一个正常的多进程程序,父进程必须要接收完所有子进程的退出码,而这个接收的过程就是进程等待 <T_T。

进程等待的方法

进程等待的方式分为两种:

  • 阻塞等待:如同字面的意思,在等待子进程退出码的时候停止(阻塞)父进程的运行。
  • 非阻塞等待:在子进程运行的同时,父进程也运行代码,但是得不时对子进程的退出情况进行检查。

在C语言中,等待进程的函数为 waitwaitpid,它们的差别在与参数的不同。

#include<sys/types.h>
#include<sys/wait.h>pid_t wait(int*status);
/*
返回值:成功返回被等待进程 pid,失败返回-1。
参数:输出型参数,获取子进程退出状态,不关心则可以设置成为NULL
*/pid_ t waitpid(pid_t pid, int *status, int options);
/*
返回值:正常返回时返回子进程的pid,如果调用失败返回-1;注意:如果options设置成了非阻塞等待,子进程没有退出时返回0;
参数:pid:Pid=-1,等待任一个子进程。与wait等效;Pid>0.等待其进程ID与pid相等的子进程;status:WIFEXITED(status): 若为正常终止子进程返回的状态,则为真。(查看进程是否是正常退出);WEXITSTATUS(status): 若WIFEXITED非零,提取子进程退出码。(查看进程的退出码);options:WNOHANG: 若pid指定的子进程没有结束,程序返回0,父进程继续执行代码,在一段时间再次调用确定子进程退出;
*/
  • 阻塞等待
    阻塞等待意味着父进程在等待期间是什么都不做的,所以期间只有子进程在运行。
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>int main()
{pid_t id = fork();		//在linux系统中使用fork来生成子进程if(id < 0)_exit(1);	//子进程生成异常if(id == 0) //分流{	//子进程printf("child is run, pid is:%d\n",getpid());sleep(3);exit(0);}else{	//父进程int status = 0;pid_t ret = waitpid(-1, &status, 0);  //阻塞等待if(WIFEXITED(status) && ret == id)printf("wait child 5s success, child return code is :%d.\n",WEXITSTATUS(status));else  {printf("wait child failed, return.\n");return 1;}}return 0;
}

在这里插入图片描述

  • 非阻塞等待
    非阻塞等待只需把 waitpid 最后的参数改为WNOHANG即可
int main()
{pid_t id = fork();		//在linux系统中使用fork来生成子进程if(id < 0)_exit(1);	//子进程生成异常if(id == 0) //分流{	//子进程printf("child is run, pid is:%d\n",getpid());sleep(3);exit(0);}else{	//父进程int status = 0;pid_t ret;do {ret = waitpid(-1, &status, WNOHANG);  //非阻塞等待if (ret == 0){printf("child is running\n");}sleep(1);}while (ret == 0);if(WIFEXITED(status) && ret == id)printf("wait child 5s success, child return code is :%d.\n",WEXITSTATUS(status));else  {printf("wait child failed, return.\n");return 1;}}return 0;
}

在这里插入图片描述

进程替换

进程替换的概念

进程替代是指程序在运行期间执行另一个程序,但这个替换是把整个程序从头到尾都换成了新的程序(pcb还是同样的,所以进程id不变),即使替换的程序结束完毕,也不会回到原有的代码继续执行,所以一般都是由子进程来进行进程替换。

在这里插入图片描述

替换方式

C语言的进程替换函数

/*函数如果执行成功将会替换成新的程序,如果执行失败则返回-1*/
int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg, ...,char *const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execve(const char *path, char *const argv[], char *const envp[]);

虽然函数很多,但其实它们都有着一套很好记得命名规范:

  • l (list):指使用列表参数,即可变参数列表(arg…)
  • v(vector):指使用使用数组来传递参数
  • p(path):指自动搜寻环境变量
  • e(env):指自己维护环境变量

在这里插入图片描述

替换实例

int main()
{pid_t id = fork();		if(id == 0){	//子进程execlp("exa", "exa", "--icons", NULL);		//p代表自动搜索环境变量,无需使用绝对路径printf("child is exit\n");	//如果execlp执行成功不会打印exit(1);}else {	//父进程printf("i'am father, pid:%d\n", getpid());}return 0;
}

在这里插入图片描述

📓总结

📜博客主页:主页
📫我的专栏:C++
📱我的github:github

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

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

相关文章

【matlab程序】图像最大化填充画布

【matlab程序】图像最大化填充画布 不做任何修饰&#xff1a; 修饰&#xff1a; 图片 往期推荐 图片 【python海洋专题一】查看数据nc文件的属性并输出属性到txt文件 【python海洋专题二】读取水深nc文件并水深地形图 【python海洋专题三】图像修饰之画布和坐标轴 【Pytho…

2023-简单点-树莓派-camera module 3介绍

Raspberry Pi Camera Module 3 介绍开头先说&#xff0c;注意事项libcamera感光芯片和驱动的兼容图额外&#xff1a;不同module的对应的参数图用bullseye系统测试摄像头预览窗口拍摄静态图片bayer raw图像获取超长曝光视频流raw视频流 ref 介绍 树莓派镜像在Bullseye版本之后&…

高效的将两个文件夹中多余的文件删除

高效的将两个文件夹中多余的文件删除 解决方案 之前使用的是这个方法&#xff0c;但是图像太多&#xff0c;需要删除的有70W张&#xff0c;得删10多天。。 将两个文件夹中重复的图象删除 解决方案 先将image图像复制一份&#xff0c;然后改名为txt import osdef change_file…

论文笔记:Confidential Assets

Confidential Assets 描述了一种称为“保密交易”的方案&#xff0c;该方案模糊了所有UTXO的金额&#xff0c;同时保持了不创建或销毁硬币的公共可验证性。进一步将此方案扩展到“保密资产”&#xff0c;一种单一的基于区块链的分类帐可以跟踪多种资产类型的方案。将保密交易扩…

Attention机制(笔记)

参考&#xff1a;2.3.2注意力机制-part1_哔哩哔哩_bilibili 什么是attention&#xff1f; 答&#xff1a;注意力放在事物最有辨识度的部分 attention计算机制&#xff1a; 为什么用这个公式可以得到attention&#xff1f; 补充说明&#xff08;chatGPT给出的解释&#xff09;&…

值得收藏的15 个好用的 iPad/iPhone 数据恢复工具

有时您需要从移动或平板设备恢复关键数据。 许多人已经开始在手机上存储重要文件&#xff0c;因为他们可以在旅途中或现在几乎在任何情况下轻松访问数据。 不言而喻; 您只需在手机上轻轻一按&#xff0c;即可轻松访问电子邮件、共享图片、编辑和共享文档、支付账单等。一般来…

【Openstack Train安装】七、glance安装

Glance是为虚拟机的创建提供镜像的服务&#xff0c;我们基于Openstack是构建基本的IaaS平台对外提供虚拟机&#xff0c;而虚拟机在创建时必须为选择需要安装的操作系统&#xff0c;Glance服务就是为该选择提供不同的操作系统镜像。Glance提供Restful API可以查询虚拟机镜像的me…

Flutter创建TabBar

使用TabBar和TabBarView来创建一个包含"首页"、"分类"和"我的"的TabBar。每个Tab对应一个Tab控件&#xff0c;TabBarView中的每个页面对应一个Widget。 1.Tab使用自定义图标和颜色 一般UI设计的图会带渐变色之类的&#xff0c;应该保持图片的原…

【实战教程】PHP如何轻松对接阿里云直播?

1. 配置阿里云直播的推流地址和播放地址 使用阿里云直播功能前&#xff0c;首先需要在阿里云控制台中创建直播应用&#xff0c;然后获取推流地址和播放地址。 推流地址一般格式为&#xff1a; rtmp://{Domain}/{AppName}/{StreamName}?auth_key{AuthKey}-{Timestamp}-{Rand…

什么是API? (应用程序编程接口)

我们经常听到 API 这个专业名称。那么什么是 API 呢&#xff1f; 定义 API&#xff08;Application Programming Interface&#xff0c;应用程序接口&#xff09;是一些预先定义的函数&#xff0c;或指软件系统不同组成部分衔接的约定。目的是提供应用程序与开发人员基于某软…

【电路笔记】-分流器

分流器 文章目录 分流器1、概述2、通用/网络配置3、无功分流器3.1 电阻电容分流器3.2 电阻-电感分流器 4、总结 我们在之前关于分压器的文中已经看到&#xff0c;分压过程是通过在串联配置中关联相同的组件来实现的。 在本文中&#xff0c;我们将重点关注电流分频器执行的电流分…

四个方法,设置excel文件只读模式

由于excel文件经常用于数据文件&#xff0c;数据就需要特别保护&#xff0c;大家可能需要将文件设置为只读模式来保护数据不被修改&#xff0c;Excel文件想要设置为只读的方法有很多&#xff0c;今天分享四种方法给大家&#xff1a; 方法一&#xff1a;文件属性 右键点击文件…

浅谈交流电表在印度充电桩生产厂家的应用

一.背景&#xff1a; 近几年为应对温室气体的排放导致的全球变暖、气候变化等问题,各大国纷纷对焦推进电动汽车&#xff0c;从而减少传统燃油汽车带来的大量温室气体排放。而推进新能源汽车的各项举措之中&#xff0c;充电桩的基础建设&#xff0c;又是其中的重中之重&#xf…

开源播放器GSYVideoPlayer + ViewPager2 源码解析

开源播放器GSYVideoPlayer ViewPager2 源码解析 前言一、GSYVideoPlayer&#x1f525;&#x1f525;&#x1f525;是什么&#xff1f;二、源码解析1.ViewPager2Activity 总结 前言 本文介绍GSYVideoPlayer源码中关于ViewPager2 GSYVideoPlayer 实现的滑动播放列表的实现原理。…

VMD-Attention-LSTM 价格预测实战

VMD-Attention-LSTM时间序列价格预测实战 完整数据代码可直接运行_哔哩哔哩_bilibili 数据展示:数据有几万条 足够的 主要模型代码: import tensorflow as tfdef attention_3d_block(inputs,TIME_STEPS,SINGLE_ATTENTION_VECTOR):# inputs.shape = (batch_size, time_steps,…

区间合并笔记

文章目录 什么是区间合并怎么做区间合并AcWing 803. 区间合并思路解析my - CODEdalao の CODE 什么是区间合并 区间合并是指给定多个区间&#xff0c;让你将重合的区间合并为一个区间 怎么做区间合并 区间合并类问题大多三个办法&#xff1a; 按左端点排序按右端点排序按左右…

Apache Doris 整合 FLINK CDC 、Paimon 构建实时湖仓一体的联邦查询入门

1.概览 多源数据目录&#xff08;Multi-Catalog&#xff09;功能&#xff0c;旨在能够更方便对接外部数据目录&#xff0c;以增强Doris的数据湖分析和联邦数据查询能力。 在之前的 Doris 版本中&#xff0c;用户数据只有两个层级&#xff1a;Database 和 Table。当我们需要连…

一键删除方舟编译器缓存文件js、js.map插件ArkCompilerSupport

新手学习鸿蒙开发&#xff0c;发现DevEco Studio编译过种会生成js、js.map&#xff0c;在论坛上看了其它开发者也提了问题但无没解决&#xff0c;写了一个插件大家试下&#xff1a; https://plugins.jetbrains.com/plugin/23192-arkcompilersupport 源码&#xff1a;https://g…

深度学习——Loss汇总

深度学习——Loss汇总 一、IOU Loss二、L1 Loss 一、IOU Loss 公式&#xff1a; 参考资料: 目标检测回归损失函数——IOU、GIOU、DIOU、CIOU、EIOU 二、L1 Loss 公式&#xff1a; 参考资料: PyTorch中的损失函数–L1Loss /L2Loss/SmoothL1Loss

高并发架构设计方法:面对高并发,怎么对症下药?

Java全能学习面试指南&#xff1a;https://javaxiaobear.cn 我们知道&#xff0c;“高并发”是现在系统架构设计的核心关键词。一个架构师如果设计、开发的系统不支持高并发&#xff0c;那简直不好意思跟同行讨论。但事实上&#xff0c;在架构设计领域&#xff0c;高并发的历史…