「Linux」进程等待与替换

news2024/11/16 21:54:40
在这里插入图片描述

💻文章目录

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


📄前言

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

进程等待

进程等待的概念

我们知道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.coloradmin.cn/o/1270830.html

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

相关文章

记一次:Python的学习笔记一

前言&#xff1a;之前学习的Python笔记&#xff0c;已经过去很多年了&#xff0c;不久前重新翻了出来练习练习。不完善的地方在缝缝补补 一、环境搭建 1.1、Python的win环境安装 0、python-3.12.0软件安装&#xff1a;Win11环境搭建python-3.12.0-amd64 这里小小注意一下&a…

Docker的基本概念和优势,以及在应用程序开发中的实际应用

文章目录 概要 基本概念 容器 (Container): 镜像 (Image): Dockerfile: 仓库 (Repository): 容器编排 (Orchestration): Docker Compose: Docker Daemon 和 Docker Client: 网络 (Network): 数据卷 (Volume): 主要优势 应用场景 小结 概要 Docker 是一种容器化平台&#xff0c;…

网易区块链,网易区块链赋能赣州脐橙数字藏品,数字指纹解决方案

目录 网易区块链 网易区块链赋能赣州脐橙数字藏品,助力革命老区三农之路 数字指纹解决方案 网易区块链 网易区块链成立于2017年,致力于Web3.0区块链技术的研发和应用。自主研发的区块链“天玄”引擎,在单链场景下支持每秒最高30万笔交易,单日可处理上链数据超10亿。 与…

最新AI智能写作回答系统源码 附完整的搭建教程

随着人工智能技术的快速发展&#xff0c;AI在各个领域的应用越来越广泛。在写作领域&#xff0c;AI智能写作回答系统已经成为一种新型的写作工具&#xff0c;可以帮助人们快速、准确地生成文章&#xff0c;提高写作效率和质量。 以下是部分代码的示例&#xff1a; 系统的特色功…

哈希桶——开放定址法

哈希表的迭代器&#xff1a; 迭代器模板介绍&#xff1a; template<class K, class T, class Ref, class Ptr, class KeyOfT, class Hash> K:关键词类型 T:存储的数据类型 Ref:T& &#xff08;operator*() 解引用函数的返回类型&#xff09; Ptr:T* (oper…

【LeetCode】每日一题 2023_11_30 确定两个字符串是否接近 (数组、排序、哈希/位运算、脑筋急转弯)

文章目录 刷题前唠嗑题目&#xff1a;确定两个字符串是否接近题目描述代码与解题思路 结语 刷题前唠嗑 LeetCode&#xff1f;启动&#xff01;&#xff01;&#xff01; 刷完今天&#xff0c;我的每日一题就坚持一个月啦&#xff0c;月度勋章要到手啦 今早很尴尬&#xff0c;…

利用 LD_PRELOAD劫持动态链接库,绕过 disable_function

目录 LD_PRELOAD 简介 程序的链接 动态链接库的搜索路径搜索的先后顺序&#xff1a; 利用LD_PRELOAD 简单的劫持 执行id命令 反弹shell 引申至 PHP 绕过disable_function 方法1&#xff1a;使用蚁剑的扩展工具绕过disable_function 方法2&#xff1a;利用 mail 函数…

Nginx实现(动静分离)

动静分离应该是听的次数较多的性能优化方案&#xff0c;那先思考一个问题&#xff1a;「「为什么需要做动静分离呢&#xff1f;它带来的好处是什么&#xff1f;」」 其实这个问题也并不难回答&#xff0c;当你搞懂了网站的本质后&#xff0c;自然就理解了动静分离的重要性。先来…

代理注册行业CRM系统:提升客户满意度,增加业绩

代理注册行业客户量大、合同繁多&#xff0c;传统的管理方式不再能够满足代理注册企业的管理需求。为了响应国家的数字化号召&#xff0c;很多代理注册企业开始使用CRM系统。下面就来说说&#xff0c;代理注册行业CRM系统有什么作用&#xff1f; 1、客户信息管理 代理注册行业…

洗袜子的洗衣机哪款好?内衣洗衣机便宜好用的牌子

不得不说洗衣机的发明解放了我们的双手&#xff0c;而我们从小到大就有这个意识&#xff0c;贴身衣物不可以和普通的衣服一起丢进去洗衣机一起&#xff0c;而内衣裤上不仅有肉眼看见的污渍还有手上根本无法消灭的细菌&#xff0c;但是有一款专门可以将衣物上的细菌杀除的内衣洗…

vue找依赖包的网址

https://www.npmjs.com/ 浅收藏一下

【网络奇遇之旅】:那年我与计算机网络的初相遇

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; 计算机网络 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 一. 前言二. 计算机网络的定义三. 计算机网络的功能3.1 资源共享3.2 通信功能3.3 其他功能 四. 计算机网络…

tomcat控制台中文信息显示乱码

问题现象 我的tomcat版本是10.1版本。 在cmd下启动tomcat&#xff0c;会新打开控制台输出窗口&#xff1a; 控制台窗口输出的中文信息是乱码&#xff1a; 问题原因 产生这个问题的原因是&#xff1a;控制台窗口的编码和输出到控制台窗口的日志信息编码不一致。 查看tomc…

知乎第三季度财报不及预期,股价今年已累计下跌26.4%

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 知乎(ZH)报告称&#xff0c;其2023财年第三季度的收入同比增长了12.1%&#xff0c;至1.401亿美元&#xff0c;但未达到市场普遍预期的1.436亿美元&#xff0c;所以在财报后其股价出现了下跌。 第三季度知乎每股美国存托股票…

如何写好开发信标题?推荐的营销邮件主题?

打开率高的开发信标题有哪些&#xff1f;怎么写吸引人邮件标题&#xff1f; 开发信标题是您的邮件首次与受众接触的部分&#xff0c;因此&#xff0c;它必须引起他们的兴趣&#xff0c;激发他们打开邮件的欲望。蜂邮EDM将讨论如何写好开发信标题&#xff0c;以及一些成功的开发…

深入解析进程

在现代计算机系统中&#xff0c;进程是一个核心概念&#xff0c;它代表了程序的执行实例。通过并发执行多个进程&#xff0c;计算机能够提高效率和资源利用率。 1. 进程的概念 进程是指在计算机系统中正在执行的程序的实例。每个进程都有自己的地址空间、寄存器集合、堆栈和文…

ANN人工神经网络:从基础认知到现实理解

什么是神经网络&#xff1f; 神经网络的再认知 前面我们了解过&#xff0c;人工神经网络&#xff08;Artificial Neural Network&#xff0c;ANN&#xff09;是人类为了模仿人大脑的神经网络结构创建出来的一种计算机系统结构。但如果仔细深入到神经网络当中&#xff0c;会慢…

springMVC实验(二)—调式工具APIFOX的使用

【知识要点】 后端开发调试工具 前后端分离已经成为互联网类软件开发主流模式&#xff0c;没有前端操作的支持&#xff0c;如何调试后端程序的就是开发人员必须解决的问题。如&#xff1a;get类请求可以直接使用浏览器就能模拟测试&#xff0c;但是post、put等类型的请求&…

open3d-点云及其操作

open3d提供了一个专门用于点云的数据结构 PointCloud。 class PointCloud(Geometry3D):color # 颜色normals # 法向量points # 点云def __init__(self, *args, **kwargs):"""__init__(*args, **kwargs)Overloaded function.1. __init__(self: open3d.cpu.py…

对某登录站点的JS前端逆向思路

前言 js逆向一直没有相关了解&#xff0c;虽然目前渗透遇见的不是很多&#xff0c;大多数遇见的要么不加密&#xff0c;要么无法实现其加密流程&#xff0c;不过最近看到了一个较为简单的站点正好能够逆向出来&#xff0c;就做了简单记录。本文旨在介绍js逆向的一些基础思路&a…