【linux】进程控制(2)

 

3. 进程等待

1. 是什么

通过系统调用 wait/waitpid 对子进程的退出状态进行检测和回收的功能

2. 为什么

僵尸进程无法杀死,通过进程等待来杀掉它,进而解决内存泄漏的问题

(一)进程等待的方法

 

a. wait :

代码

wait :

等待任意一个子进程

注意:

如果子进程不退出,父进程调用wait的时候,也不会返回,父进程会一直等待子进程,默认状态为阻塞状态

b. waitpid

pid_ t waitpid(pid_t pid, int *status, int options)

(一) 返回值:

  1. 当正常返回的时候waitpid返回收集到的子进程的进程ID
  2. 如果设置了选项WNOHANG,而调用中waitpid发现没有已退出的子进程可收集,则返回0;

如果调用中出错,则返回-1,这时errno会被设置成相应的值以指示错误所在

(二) 参数:

  1. pid:
  • pid = -1 ,等待任一个子进程 (与wait等效)
  • pid > 0 ,等待其进程ID与pid相等的子进程

2. status:

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

3. options:

等待方式

options = 0 , 进行阻塞等待 (父进程会一直等待它的子进程)

options = WNOHANG 非阻塞轮询

  • WNOHANG: 若pid指定的子进程没有结束,则waitpid()函数返回0,不予以等待。若正常结束,则返回该子进程的ID 。若函数调用失败,则返回值小于0

注意:

  • 如果子进程已经退出,调用wait/waitpid时,wait/waitpid会立即返回,并且释放资源,获得子进程退

出信息

  • 如果在任意时刻调用wait/waitpid,子进程存在且正常运行,则进程可能阻塞
  • 如果不存在该子进程,则立即出错返回

(二)获取子进程 status

wait和waitpid,都有一个status参数,该参数是一个输出型参数,由操作系统填充

  1. 如果传递NULL,表示不关心子进程的退出状态信息;否则,操作系统会根据该参数,将子进程的退出信息反馈给父进程
  2. status不能简单的当作整形来看待,可以当作位图来看待,具体细节如下图(只研究status低16比特

位)

4. 进程程序替换

(一)替换原理

  1. 用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数
  2. 以执行另一个程序。当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动例程开始执行。调用exec并不创建新进程,所以调用exec前后该进程的id并未改变
  3. 发生程序替换,环境变量的信息不会被替换

单进程版程序替换

注意:

  1. 替换的是数据和代码,没有创建新的进程PCB
  2. 程序替换成功之后,exec函数后面的代码不会被执行;替换失败,exec函数后面的代码继续被执行(成功没有返回值,失败才有返回时)

(二)替换函数

有六种以exec开头的函数,统称exec函数

#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[]);

execl 举例

l : 像列表一样列出来 (arg 参数)

path : 代表所执行的进程的路径 , arg : 代表要执行的进程以及指令(以 NULL 结尾)

execlp 举例

p : 在PATH 路径下找需要的进程

 execle 举例

e : 必须自己传环境变量参数

注意:

如果我们传入自定义的环境变量参数,则替换进程的环境变量直接被参数覆盖

execv 举例 

v : 像 vector一样存储(以 NULL 结尾)

(三)函数解释

这些函数如果调用成功则加载新的程序从启动代码开始执行,不再返回 ;如果调用出错则返回-1

所以exec函数只有出错的返回值而没有成功的返回值

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

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

相关文章

B3635 硬币问题

题目描述 今有面值为 1、5、11 元的硬币各无限枚。 想要凑出 nn 元&#xff0c;问需要的最少硬币数量。 输入格式 仅一行&#xff0c;一个正整数 nn。 输出格式 仅一行&#xff0c;一个正整数&#xff0c;表示需要的硬币个数。 输入输出样例 输入 #1复制 15 输出 #1复…

某仿soul欲音社交系统存在任意文件读取漏洞

1 阅读须知 技术文章仅供参考&#xff0c;此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等&#xff08;包括但不限于&#xff09;进行检测或维护参考&#xff0c;未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直…

医院管理|基于java的医院管理系统小程序(源码+数据库+文档)

医院管理系统小程序 目录 基于java的医院管理系统小程序 一、前言 二、系统设计 三、系统功能设计 医生信息管理 排班信息管理 科室信息管理 科室预约 病历信息 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a;…

llvm后端之td定义指令信息

llvm后端之td定义指令信息 引言1 定义指令2 定义Operand3 定义SDNode4 PatFrags4.1 ImmLeaf4.2 PatLeaf 5 ComplexPattern6 谓词条件7 理解dag 引言 llvm后端通过td定义指令信息&#xff0c;并通过dag匹配将IR节点转换为平台相关的指令。 1 定义指令 td通过class Instructio…

AVL树的模拟实现(插入,验证)

目录 前言 AVL树的概念 AVL树的旋转 旋转 左旋 右旋 左右旋 右左旋 AVL的insert的实现 AVL的验证 完整代码 总结 前言 本文会先将AVL树的旋转进行讲解&#xff0c; 然后再对代码进行实现和展示。 AVL树的概念 首先 AVL树 是一种平衡树&#xff0c; 平衡树是在二…

特斯拉的底牌

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

android BLE 蓝牙的连接(二)

下面是基于实际的项目得到的具体步骤及核心代码 1、权限问题 先判断手机是否满足android4.3以上版本&#xff0c;再判断手机是否开启蓝牙 主要涉及蓝牙权限和位置权限&#xff0c;注意不同android版本之间权限申请的差异&#xff0c;以及android权限动态申请和静态申请的区别 …

MySQL——数据库的高级操作(一)数据备份与还原(2)数据的还原

当数据库中的数据遭到破坏时&#xff0c;可以通过备份好的数据文件进行还原&#xff0c;这里所说的还原是指还原数据库中的教据&#xff0c;而库是不能被还原的&#xff0c;我们知道&#xff0c;备份文件实际上就是由多个 CRRATE&#xff0c;INSERT 和 DROP 语句组成&#xff0…

【每日一题】LeetCode 98.验证二叉搜索树(树、深度优先搜索、二叉搜索树、二叉树)

【每日一题】LeetCode 98.验证二叉搜索树&#xff08;树、深度优先搜索、二叉搜索树、二叉树&#xff09; 题目描述 给定一个二叉树的根节点 root&#xff0c;判断该二叉树是否是一个有效的二叉搜索树&#xff08;BST&#xff09;。有效的二叉搜索树需要满足以下条件&#xf…

arm平台常用工具和动态库编译

目录 perf 交叉编译交叉编译zlib交叉编译 elfutils交叉编译 perfperf 使用 libconfig 交叉编译openssl 交叉编译libpcap 交叉编译统信、龙芯等平台编译QT交叉编译编译QT源码编译QtCreator 编译ssl编译libsrtp(2.3.0版本)编译libyuvlibopus编译libopenh264编译libusrsctp编译lib…

TCP 拥塞控制:一场网络数据的交通故事

从前有条“高速公路”&#xff0c;我们叫它互联网&#xff0c;而这条公路上的车辆&#xff0c;则是数据包。你可以把 TCP&#xff08;传输控制协议&#xff09;想象成一位交通警察&#xff0c;负责管理这些车辆的行驶速度&#xff0c;以防止交通堵塞——也就是网络拥塞。 第一…

Modbus-RTU之C语言实现

Modbus-RTU之C语言实现 Modbus-RTU之C语言实现引言Modbus-RTU的C语言实现说明.h 文件.c 文件 总结 Modbus-RTU之C语言实现 引言 前面我们介绍过Modbus-RTU传输协议&#xff08;RS-485软件层协议之Modbus-RTU&#xff09;&#xff0c;它是一种基于串口的通信协议。在这一节我们…

C语言关键字之Static

在一些.C文件中&#xff0c;总能看到static的字样&#xff0c;static作为关键字在 C 和 C 中具有重要的作用。它提供了多种使用方式&#xff0c;帮助程序员控制变量和函数的作用域和生命周期。以下是详细介绍。 1. 静态变量 1.1 在函数内部的静态变量 当一个变量被声明为“st…

ssl 协议工作过程

ssl 协议工作过程 ChatGPT 说&#xff1a; ChatGPT SSL&#xff08;Secure Sockets Layer&#xff09;协议是用来确保网络通信安全的加密协议&#xff0c;已被TLS&#xff08;Transport Layer Security&#xff09;取代&#xff0c;但它的工作过程仍然是理解现代加密协议的重…

MySQL索引优化与B+树【后端 14】

MySQL索引优化与B树 在MySQL数据库中&#xff0c;索引是优化查询性能的关键技术之一。B树作为一种广泛使用的索引结构&#xff0c;在MySQL的InnoDB存储引擎中扮演着核心角色。本文将详细介绍B树的结构特点及其在MySQL索引优化中的应用。 B树的结构特点 B树是B-树的一个变体&a…

Linux通过特定端口查看服务是否启动

Linux通过特定端口查看服务是否启动 你可以使用netstat或ss命令来检查特定端口上的服务。例如&#xff0c;使用ss -tuln | grep <端口号>来查看端口是否被占用。 netstat 你可以使用以下命令来查看特定端口上的服务&#xff1a; netstat -tuln | grep <端口号>…

uni-app怎么使用uni-icons

首先在官网&#xff08;uni-icons 图标 | uni-app官网&#xff09;中找到下载地址 uni-icons 图标 - DCloud 插件市场 把这个插件下载下来。目录结构是这样的。我们找到uni_modules 把里面的uni-icons粘贴到自己的项目中 我是放在了我的components下面了 然后再页面中引用这个…

血缘解析<二>:如何解析带CTE语句的Sql

blood 一、思路二、代码 一、思路 之前文章血缘解析介绍了血缘解析的思路,但是对于带CTE语句的sql解析不到 eg: with tmp as (select id,name,agefrom personinfo ),tmp1 as (select a.id,a.name,a.age,b.classnofrom tmp ajoin classinfo bon a.id b.id )select id,name,ag…

搜索功能技术方案

1. 背景与需求分析 门户平台需要实现对服务信息的高效查询&#xff0c;包括通过关键字搜索服务以及基于地理位置进行服务搜索。面对未来可能的数据增长和性能需求&#xff0c;选择使用 Elasticsearch 来替代 MySQL 的全文检索功能。这一选择的背景与需求可以总结为以下几点&am…

Rust程序结构与代码注释

【图书介绍】《Rust编程与项目实战》-CSDN博客 《Rust编程与项目实战》(朱文伟&#xff0c;李建英)【摘要 书评 试读】- 京东图书 (jd.com) Rust编程与项目实战_夏天又到了的博客-CSDN博客 3.1 Rust程序结构 我们从一个最简单的程序入手&#xff0c;来观察一个Rust的程序结…