进程的控制

文章目录

  • 进程退出
  • 进程等待
  • 进程程序替换

正文开始前给大家推荐个网站,前些天发现了一个巨牛的 人工智能学习网站, 通俗易懂,风趣幽默,忍不住分享一下给大家。 点击跳转到网站。

进程退出

进程的退出一共有三种场景。

  1. 程序跑完,结果正确,正常退出。
  2. 程序跑完,结果不正确,正常退出。
  3. 代码没有跑完,程序异常退出。

所以在Linux中我们可以通过 echo $? 查看最近一个进程的退出码。
在这里插入图片描述
程序正常退出的方法

  1. 从main返回
  2. 调用exit
  3. _exit

我们平时在main中return的那个数字,就是我们的退出码,并且exit和_exit都有一个整数参数,那个整数参数也是退出码。所以说我们让子进程去执行某项任务,它执行的怎么样我们就可以通过退出码来进行判断。一般来说0表示的是成功,非0就代表出错的原因,数字可以说明出错的原因,但是不利于我们人进行阅读,所以每个数字在C语言中还对应的有一个字符串,表示该数字的错误原因,这个原因我们也可以自己自定义。C语言中有一个全局的变量errno,它里面存的是最近一个函数调用发生错误的错误码。

错误码vs退出码
错误码通常是表示一个函数或者系统调用的情况。
推船一般是一个进程退出的时候,它的退出结果。

当失败时,它们就用来衡量函数、进程的出错详细原因。如果一个进程异常的话,那么它就会收到信号,所以是否收到信号可以用来衡量一个进程是否异常。所以一个信号数字和一个退出码就可以来判断一个进程是否正常退出,如果收到了信号,那么就说明异常了,一个异常的进程我们是不关心它的退出结果的,只有进程没有收到信号,并且返回值是0,那么这个进程就是正常的并且是成功的。

我们上面提到了exit和_exit的方法,那么这两个方法有什么区别呢?
最明显的区别就是exit是C语言的一个函数,而_exit是系统调用,而exit在底层也是封装了_exit的,
其次就是exit在退出的时候会刷新缓冲区,但是_exit在退出的时候不会刷新缓冲区,所以我们可以得出一个结论,我们平时在C语言中说的缓冲区一定不在系统中,它是一个语言自己封装的缓冲区。
在这里插入图片描述

进程等待

什么是进程等待?
进程等待就是通过wait/waitpid的方式,让父进程对子进程进行资源回收的等待过程。

为什么要进行等待?

  1. 子进程退出,父进程如果不管不顾,就可能造成‘僵尸进程’的问题,进而造成内存泄漏。
  2. 另外,进程一旦变成僵尸状态,那就刀枪不入,“杀人不眨眼”的kill -9 也无能为力,因为谁也没有办法杀死一个已经死去的进程。
  3. 最后,父进程派给子进程的任务完成的如何,我们需要知道。如,子进程运行完成,结果对还是不对,或者是否正常退出。
  4. 父进程通过进程等待的方式,回收子进程资源,获取子进程退出信息。

等待的方法

  1. wait
    在这里插入图片描述
  2. waitpid
    在这里插入图片描述
    如果子进程已经退出,调用wait/waitpid时,wait/waitpid会立即返回,并且释放资源,获得子进程退出信息。
    如果在任意时刻调用wait/waitpid,子进程存在且正常运行,则进程可能阻塞。
    如果不存在该子进程,则立即出错返回。

我们可以看到这两个函数都可以获取进程的退出信息,是一个整数,但是这个整数如何表示两个数字,信号和退出码的呢?这个整数不能整体看到,一般来说0~6和比特位是信号,第7个比特表示core dump,8 ~15表示退出码,后面16个比特位我们不管。
在这里插入图片描述

进程程序替换

我们父进程所创建的子进程执行的代码一般都是父进程代码的一部分,如果想让子进程执行全新的代码,就可以使用进程替换,所以进程替换就是让进行程序替换的进程执行全新的代码访问全新的数据,不和父进程有任何的瓜葛。
用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动例程开始执行。调用exec并不创建新进程,所以调用exec前后该进程的id并未改变。

在这里插入图片描述
磁盘中的可执行程序中的ELF中是保存了可执行程序的入口地址,所以不用担心替换后的进程没法找到入口地址的问题。程序替换有6种函数。

#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[]);
int execve(const char *path, char *const argv[], char *const envp[]);

前5个都是普通函数,第六个是系统调用,前面5个在底层本质也是封装了最后一个。

  1. 这些函数如果调用成功则加载新的程序从启动代码开始执行,不再返回。
  2. 如果调用出错则返回-1
  3. 所以exec函数只有出错的返回值而没有成功的返回值。

这些函数都是exec开头的,作用都一样,只不过参数不一样可以应对各种场景。
l(list) : 表示参数采用列表
v(vector) : 参数用数组
p(path) : 有p自动搜索环境变量PATH
e(env) : 表示自己维护环境变量

在这里插入图片描述

在这里插入图片描述

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

nacos开启鉴权+springboot配置用户名密码

nacos默认没有开启鉴权&#xff0c;springboot无需用户名密码即可连接nacos。从2.2.2版本开始&#xff0c;默认控制台也无需登录直接可进行操作。 因此本文记录一下如何开启鉴权&#xff0c;基于nacos2.3.0版本。 编辑nacos服务端的application.properties&#xff1a; # 开…

硬件工程师入门基础知识(二)片式电阻、片式网络电阻标识和焊接使用注意事项

片式电阻、片式网络电阻标识和使用注意事项 1.概述2.阻值标识2.1 标识原则2.2片式类电阻、片式电阻网络标识方法2.3电阻网络标识方法 3.电阻产品包装3.1片式电阻、片式电阻网络的包装3.2电阻网络的包装 4.使用注意事项4.1 片式电阻推荐焊盘尺寸4.2片式电阻网络推荐焊盘尺寸 5.焊…

STM32 +合宙1.54“ 电子墨水屏(e-paper)驱动显示示例

STM32 合宙1.54“ 电子墨水屏&#xff08;e-paper&#xff09;驱动显示示例 &#x1f4cd;相关篇《Arduino框架下ESP32/ESP8266合宙1.54“ 电子墨水屏&#xff08;e-paper&#xff09;驱动显示示例》&#x1f516;程序是从GooDisplay品牌和微雪电子下同型号规格墨水屏的示例程序…

Vue项目 快速上手(如何新建Vue项目,启动Vue项目,Vue的生命周期,Vue的常用指令)

目录 一.什么Vue框架 二.如何新建一个Vue项目 1.使用命令行新建Vue项目 2.使用图形化界面新建Vue项目 三.Vue项目的启动 启动Vue项目 1.通过VScode提供的图形化界面启动Vue项目 2.通过命令行的方式启动Vue项目 四.Vue项目的基础使用 常用指令 v-bind 和 v-model v…

【Unity每日一记】角色控制器Character Contorller

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…

c# .net8 香橙派orangepi + hc-04蓝牙 实例

这些使用c# .net8开发,硬件 香橙派 orangepi 3lts和 hc-04蓝牙 使用场景:可以通过这个功能,手机连接orangepi进行wifi等参数配置 硬件: 1、带USB口的linux开发板orangepi 2、USB 转TTL 中转接蓝牙(HC-04) 某宝上买的蓝牙官方网有调试工具:HC-T串口助手 https://www…

leetcode 3.反转链表;

1.题目&#xff1a; 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 2.用例&#xff1a; 3.题目解析&#xff1a; &#xff08;1&#xff09;函数头&#xff1a; 要求返回结点&#xff0c;就 ListNode* reverseList(ListNode* head)&…

【数据开发】大数据岗位,通用必备技术栈(数据分析、数据工程、数据科学)

【数据开发】大数据岗位&#xff0c;通用必备技术栈&#xff08;数据分析、数据工程、数据科学&#xff09; 文章目录 1、岗位与技术要求1.1 常见岗位介绍1.2 行业发展方向1.3 附部分JD 2、数据开发技术栈2.1 数据处理流程2.2 学习路线与框架 3、数据分析技术栈3.1 基础知识3.2…

如何一步一步地优化LVGL的丝滑度

经过一番周折将LVGL移植到了STM32F407单片机上&#xff0c;底层驱动的LCD是st7789&#xff0c;移植时的条件和环境如下&#xff1a; ●LVGL用的是单缓冲&#xff0c;一次刷新10行&#xff1b; ●刷新函数用的是最原始的一个一个打点的方式&#xff1b; ●ST7789底层发送数据用的…

【MySQL】学习和总结标量子查询

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-kLo6jykc7AcEVEQk {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

JMeter--9.录制脚本

录制步骤 1.新建线程组&#xff1a;测试计划->线程->线程组 测试计划下&#xff0c;至少要有1个线程组&#xff0c;因为在录制器中需要选择【目标控制器】 2. 新建录制器&#xff1a;测试计划->非测试原件->HTTP(S)测试脚本记录器&#xff08;HTTP代理服务器&…

Linux磁盘如何分区?

首先需要先给虚拟机添加磁盘 sblk #查看磁盘设备 得到以下内容&#xff1a; NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 20G 0 disk ├─sda1 8:1 0 1G 0 part /boot └─sda2 8:2 0 19G 0 pa…

毕业后的那两年,我是怎么从一个啥也不会的小白成长为成熟职场人的?

对于2023应届生而言&#xff0c;从毕业到踏入职场也许正是你人生中很大的一个变化&#xff0c;但在初入职场的期间&#xff0c;很多同学很容易因为一些经验问题而误入弯路。 笔者从一个职场萌新到如今的职场老人&#xff0c;一路走来也经历了不少社会毒打。在职场生涯中&#…

kubectl 命令行管理K8S(上)

目录 陈述式资源管理方式 介绍 命令 项目的生命周期 创建 kubectl create命令 发布 kubectl expose命令 更新 kubectl set 回滚 kubectl rollout 删除 kubectl delete 应用发布策略 金丝雀发布 陈述式资源管理方式 介绍 1.kubernetes 集群管理集群资源…

Nest.js权限管理系统开发(八)jwt登录

安装相关依赖 虽然仅使用nestjs/jwt就能实现身份验证的功能&#xff0c;但是使用passport能在更高层次上提供更多便利。Passport 拥有丰富的 strategies 生态系统&#xff0c;实现了各种身份验证机制。虽然概念简单&#xff0c;但你可以选择的 Passport 策略集非常丰富且种类繁…

kotlin与java的相互转换

Kotlin转java 将kotlin代码反编译成java Tools -> Kotlin -> Show Kotlin Bytecode 然后点击 【Decompile】 生成java代码 java转kotlin Code -> Convert Java File To Kotlin File

Netty入门指南:从零开始的异步网络通信

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 Netty入门指南&#xff1a;从零开始的异步网络通信 前言Netty简介由来&#xff1a;发展历程&#xff1a;异步、事件驱动的编程模型&#xff1a; 核心组件解析通信协议高性能特性异步编程范式性能优化与…

2055041-59-1,NH-(PEG4-acid)2,能将基因和蛋白质导入到细胞内

您好&#xff0c;欢迎来到新研之家 文章关键词&#xff1a;2055041-59-1&#xff0c;NH-bis(PEG4-acid) HCl salt&#xff0c;NH-(PEG4-acid)2&#xff0c;NH-bis(PEG4-acid)&#xff0c;NH-BIS(四聚乙二醇-羧酸) 盐酸盐 一、基本信息 【产品简介】&#xff1a;NH bis (PEG4…

全新抖音视频下载软件|批量视频下载工具

随着抖音平台上精彩视频的不断涌现&#xff0c;许多用户希望能够方便地保存自己喜欢的视频内容&#xff0c;以便随时观看或分享给朋友。为了满足这一需求&#xff0c;我们基于C#开发了一款全新的视频下载软件&#xff0c;为您提供便捷、高效的视频获取体验。 主要功能模块&…

redis-Redis主从,哨兵和集群模式

一&#xff0c;Redis的主从复制 ​ 主机数据更新后根据配置和策略&#xff0c; 自动同步到备机的master/slaver机制&#xff0c;Master以写为主&#xff0c;Slave以读为主。这样做的好处是读写分离&#xff0c;性能扩展&#xff0c;容灾快速恢复。 1.1 环境搭建 如果你的redi…