【Linux杂货铺】进程控制


目录

🌈前言🌈

📁 进程创建

📂 fork函数

📂 写实拷贝

📂 创建进程的目的

📂 创建失败原因

📁 进程终止

📂 概念

📂 场景

📂 退出方法

📁 进程等待

📂 概念

📂等待方式

📁 进程替换

📂 原理

📂 替换函数

📂 命名解释 

📁 总结


🌈前言🌈

        欢迎收看本期【Linux杂货铺】,本期内容将讲解Linux中如何管理控制进程,包含了创建进程,进程终止,等待进程,进程替换等内容,期间会拓展讲解写实拷贝,系统调用接口的使用等内容。

📁 进程创建

📂 fork函数

        在Linux中fork函数是非常重要的函数,是用来在已有的进程中创建一个新的进程。新进程为子进程,原有进程为父进程。

#include <unistd.h>pid_t fork(void);返回值: 有两个返回值,对于父进程返回子进程的pid,子进程返回0,出错返回-1

进程调用fork函数,内核做:

1. 分配新的内存块和内存数据结构给子进程。

2. 将父进程部分数据结构拷贝到子进程。

3. 添加子进程到系统进程列表中。

4. fork返回,开始调度器调度。

📂 写实拷贝

        通常,父子进程代码共享,父子不在写入时,数据也是共享的即指向同一块内存块。当任意一方进行写入时,会创建新的内存块,不在指向同一块内存块。

        因为有页表的存在,所以在上层,看见的虚拟地址是不变的,但实际的物理地址却不同。

        在C/C++中,我们看到的地址都是虚拟地址,不是实际的物理内存地址,通过页表的映射,来操作物理地址上的数据。

        所以,写实拷贝就是,当共享代码和数据的父子进程,任意一方修改数据时,会创建新的物理内存,改变虚拟地址与物理地址的映射,虚拟地址不变。

📂 创建进程的目的

        1. 父进程希望复制自己,使父子进程执行不同的代码段。(通过if 判断来执行不同的代码)

        2. 一个进程要执行一个不同的程序。(进程替换)

📂 创建失败原因

        1. 系统有太多的进程。

        2. 实际用户的进程数超过了限制。

📁 进程终止

📂 概念

        1. 释放代码和数据占用的空间。

        2. 释放内核数据结构(页表,地址空间),但是PCB延迟处理,并将进程进程设为Z(僵尸状态),等待父进程处理。

📂 场景

1. 程序运行完毕,结果正确。

2. 程序运行完毕,结果不正确。(退出码)

        进程想要告诉父进程运行完毕,结果是否正确。怎么告诉呢,就有了退出码的概念。退出码的作用,就是告诉父进程,子进程退出情况是成功,还是失败,如果失败,失败原因是什么。

3. 程序异常终止。(退出信号)

        异常终止的概念是,操作系统发现了进程做了不该做的事,例如野指针的使用等。本质是操作系统向进程发送信号,杀掉进程,此时,退出码没有意义

📂 退出方法

        1. main函数中,直接return。

        2. exit() : 库函数,会刷新缓冲区,封装了_exit()。        

        3. _exit():系统调用接口,不会刷新缓冲区。

📁 进程等待

📂 概念

        子进程退出时,父进程如果不进行处理,就会造成"僵尸问题",即子进程无法被杀死,一直存在,进而造成内存泄漏。

        所以,父进程通过进程等待的方式,回收子进程资源,获取子进程的退出信息。

📂等待方式

        这里介绍的是第三种方式,waitpid方式,这三个参数分别是什么意思。

返回值:

        > 0 : 正常的返回时,waitpid返回收集到的子进程的进程id。

        == 0 : 非阻塞等待,设置了WNOHNAG,waitpid发现没有退出的子进程可收集。

        < 0 : 调用中出错,返回-1,error会被设置成相应的值以指示错误所在。例如参数给出错误的pid。

1. pid:

pid = -1,等待任意一个子进程,与wait等效。

pid > 0 ,等待进程pid与参数pid相等的子进程。

2. status:

        如果想要查看进程的退出码和退出信号,可以传递一个int类型的数据,返回时,通过操作status来查看退出码和退出信息。

        status参数是通过位图来操作的,最低的8位是终止信号;此地八位是退出码,通过&操作,来实现查看退出信息。

        标准提供了宏函数,帮助查看进程是否是正常终止,以及退出码。

WIFEXITED(status) : 若正常终止子进程,返回值为真 >0。

WEXITSTATUS(status):拓WIFEXITED非0,提取子进程退出码。

3.options:

        进程等待分为阻塞等待 和 非阻塞等待。两者的区别在于进程是否可以做其他的事情。

        例如,张三给李四打电话,李四说马上下来,张三就一直拿着电话,问好了吗,这就是阻塞等待。而如果张三打完电话,就打游戏,刷会视频,过了会再打一次电话,一直到李四下来,这就是非阻塞等待。

WNOHANG:若pid指定的子进程还没有结束,waitpid函数返回0,不予以等待。若正常结束,返回子进程的ID。

        所以,非阻塞等待 + 循环 就是实现了非阻塞轮询,就是打完电话,没下来就玩游戏,打完游戏,再打一次电话,循环往复。

📁 进程替换

📂 原理

        用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一个exec函数以执行另一个程序。当进程调用一种exec函数时,该进程的用户空间和代码和数据完全被新进程替换,从新进程的启动例程开始执行,

        调用exec函数并不创建新进程,所以调用exec前后该进程id不变。

        通过下图,可知,将替换进程数据覆盖到原有进程的物理内存中,此后,进程的数据就变为了替换进程的数据。

📂 替换函数

#include <unistd.h>
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[]);

        函数调用成功则会加载新的程序到启动代码处,开始执行,不在返回。调用出错返回-1.所以exec* 函数只有出错有返回值,没有成功的返回值。

        其中execve是系统调用接口,其他的则是库函数。

#include <unistd.h>
int main()
{char *const argv[] = {"ps", "-ef", NULL};
char *const envp[] = {"PATH=/bin:/usr/bin", "TERM=console", NULL};execl("/bin/ps", "ps", "-ef", NULL);// 带p的,可以使用环境变量PATH,无需写全路径execlp("ps", "ps", "-ef", NULL);// 带e的,需要自己组装环境变量execle("ps", "ps", "-ef", NULL, envp);execv("/bin/ps", argv);// 带p的,可以使用环境变量PATH,无需写全路径execvp("ps", argv);// 带e的,需要自己组装环境变量execve("/bin/ps", argv, envp);exit(0);
}

📂 命名解释 

l ( list ): 表示参数采用列表。

v ( vector ) : 参数用数组。

p (path) : 有p自动搜索环境变量PATH。

e (env) : 表示自己维护环境变量。

📁 总结

        以上,就是本期【Linux杂货铺】的主要内容了,其中介绍了如何创建进程;进程终止的三种场景,了解退出码和退出信号的概念;最后介绍了进程替换的概念,如何实现进程替换等内容。

        如果,感觉本期内容对你有帮助,欢迎点赞,关注,评论。Thanks♪(・ω・)ノ

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

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

相关文章

使用React搭建single-spa

自己搭建的Demo GitHub - ftao123/single-spa-react-demo: single-spa-react-demo 修改子应用的webpack配置 library: "app2"和libraryTarget: "umd"配置必须添加。 可以看到filename在开发环境下的地址是static/js/bundle.js&#xff0c;所以我们主应用…

【Delphi JCL库文件解剖 1】库文件的大体脉络

JCL库是一个开源的Delphi库文件,下载到它很容易,可是想能灵活运用它却并不容易。下面是这个库文件的大体文件脉络,咱们要分析的核心还是在 source 源代码文件。 bin - 示例应用程序可执行文件的常见位置 docs - 读…

JavaEE-文件操作和IO

我们先来认识狭义上的⽂件(file)。针对硬盘这种持久化存储的I/O设备&#xff0c;当我们想要进⾏数据保存时&#xff0c;往往不是保存成⼀个整体&#xff0c;⽽是独⽴成⼀个个的单位进⾏保存&#xff0c;这个独⽴的单位就被抽象成⽂件的概念&#xff0c;就类似办公桌上的⼀份份真…

Java程序设计 4、5章 练习题

一、填空题 1.假设有 String s1 "Welcome to Java"; String s2 s1; String s3 new String("Welcome to Java"); 那么下面表达式的结果是什么&#xff1f; (1) s1 s2 ___________true_______________ (2) s1 s3 ______…

C++ Thread 源码 观后 自我感悟 整理

Thread的主要数据成员为_Thr 里面存储的是线程句柄和线程ID 先看看赋值运算符的移动构造 最开始判断线程的ID是否不为0 _STD就是使用std的域 如果线程ID不为0&#xff0c;那么就抛出异常 这里_New_val使用了完美转发&#xff0c;交换_Val和_New_val的值 _Thr _STD exchange(_…

【动手学深度学习】深入浅出深度学习之PyTorch基础

目录 一、实验目的 二、实验准备 三、实验内容 1. 数据操作 2. 数据预处理 3. 线性代数 4. 微积分 5. 自动微分 四、实验心得 一、实验目的 &#xff08;1&#xff09;正确理解深度学习所需的数学知识&#xff1b; &#xff08;2&#xff09;学习一些关于数据的实用…

如何设置Word文档的高级属性?这里有详细步骤

我们最近向你展示了如何在Word中设置用户信息。Word还存储与文档相关的几个其他高级属性。其中一些显示在“信息”屏幕上&#xff0c;你可以更改这些属性。 注意&#xff1a;我们使用Word 2013来说明此功能。 要访问允许你更改当前打开文档的属性的对话框&#xff0c;请单击“…

使用 Amazon SageMaker 微调 Llama 2 模型

本篇文章主要介绍如何使用 Amazon SageMaker 进行 Llama 2 模型微调的示例。 这个示例主要包括: Llama 2 总体介绍Llama 2 微调介绍Llama 2 环境设置Llama 2 微调训练 前言 随着生成式 AI 的热度逐渐升高&#xff0c;国内外各种基座大语言竞相出炉&#xff0c;在其基础上衍生出…

☆【前后缀】【双指针】Leetcode 42. 接雨水

【前后缀】【双指针】Leetcode 42. 接雨水 解法1 前后缀分解解法2 双指针 ---------------&#x1f388;&#x1f388;42. 接雨水 题目链接&#x1f388;&#x1f388;------------------- 解法1 前后缀分解 维护一个前缀&#xff08;左侧最高&#xff09;后缀&#xff08;右侧…

ASP .Net Core ILogger日志服务

&#x1f433;简介 ILogger日志服务是.NET平台中的一个内置服务&#xff0c;主要用于应用程序的日志记录。它提供了灵活的日志记录机制&#xff0c;允许开发者在应用程序中轻松地添加日志功能。以下是其主要特点和组件&#xff1a; ILogger接口&#xff1a;这是ILogger日志服…

147 Linux 网络编程3 ,高并发服务器 --多路I/O转接服务器 - select

从前面的知识学习了如何通过socket &#xff0c;多进程&#xff0c;多线程创建一个高并发服务器&#xff0c;但是在实际工作中&#xff0c;我们并不会用到前面的方法 去弄一个高并发服务器&#xff0c;有更加好用的方法&#xff0c;就是多路I/O转接器 零 多路I/O转接服务器 多…

数据库系统概论(超详解!!!) 第四节 关系数据库标准语言SQL(Ⅰ)

1.SQL概述 SQL&#xff08;Structured Query Language&#xff09;结构化查询语言&#xff0c;是关系数据库的标准语言 SQL是一个通用的、功能极强的关系数据库语言 SQL的动词 基本概念 基本表 &#xff1a;本身独立存在的表&#xff1b; SQL中一个关系就对应一个基本表&am…

Python将字符串转换为datetime

有这样一些字符串&#xff1a; 1710903685 20240320110125 2024-03-20 11:01:25 要转换成Python的datetime 代码如下&#xff1a; import functools import re from datetime import datetime, timedelta from typing import Union# pip install python-dateutil from date…

鸿蒙Harmony应用开发—ArkTS-@Observed装饰器和@ObjectLink装饰器:嵌套类对象属性变化

上文所述的装饰器仅能观察到第一层的变化&#xff0c;但是在实际应用开发中&#xff0c;应用会根据开发需要&#xff0c;封装自己的数据模型。对于多层嵌套的情况&#xff0c;比如二维数组&#xff0c;或者数组项class&#xff0c;或者class的属性是class&#xff0c;他们的第二…

康奋威科技邀您到场参观2024长三角快递物流展

参展企业介绍 杭州康奋威科技股份有限公司创立于2005年&#xff0c;由国家“万人计划”专家任天挺先生创立并担任法人&#xff0c;是一家专业从事智能装备研发与制造的国家级高新技术企业。专注于自动化控制、机械设计、信息化方面的技术研究&#xff0c;主要为太阳能光伏、智…

水果软件FL Studio 21 for mac 21.2.3.3586破解版的最新版本2024介绍安装

音乐是人类最美好的语言&#xff0c;它能够跨越国界、文化和语言&#xff0c;将人们紧密地联系在一起。在当今数字化时代&#xff0c;音乐创作已经不再是专业人士的专利&#xff0c;越来越多的音乐爱好者开始尝试自己动手制作音乐。而FL Studio21中文版编曲软件正是这样一个为你…

MySQL | 用户管理

目前为止&#xff0c;我们一直使用的是root权限写的SQL语句。但如果我们只能用root&#xff0c;这样存在安全隐患。而MySQL是给我们提供了用户管理的&#xff0c;可以创建用户&#xff0c;提供权限&#xff0c;收回权限。 1. 用户 MySQL中的用户&#xff0c;都存储在系统数据库…

【零基础C语言】联合体(共用体)和枚举

目录 自定义类型&#xff1a;联合体(共用体)和枚举 1.自定义类型&#xff1a;联合体(共用体) 1.1 联合体的声明 1.2 联合体的特点 ​编辑1.3 联合体的大小计算 1.4使⽤联合体是可以节省空间的 1.5使用联合体写一个程序判断机器是大端还是小端存储 2.自定义类型&#xff1a;…

银行数字人民币系统应用架构设计

2019年10月&#xff0c;01区块链联合数字资产研究院发布了《人民币3.0&#xff1a;中国央行数字货币运行框架与技术解析》&#xff0c;从数字货币界定和人民币发展历程出发&#xff0c;区分了央行数字货币与比特币、移动支付等的区别&#xff0c;全面介绍了央行数字货币的发展历…

【Qt】使用Qt实现Web服务器(七):动态模板引擎

1、示例 2、源码 2.1 模板配置参数 配置文件中关于模板配置参数如下 path为存放模板的目录suffix为模板文件后缀[templates] path=templates suffix=.tpl encoding=UTF-8 cacheSize=1000000