首页 > 系统相关 >【linux】进程控制(2)

【linux】进程控制(2)

时间:2024-09-11 23:49:53浏览次数:3  
标签:控制 const exec char linux 进程 waitpid wait

 

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函数只有出错的返回值而没有成功的返回值

标签:控制,const,exec,char,linux,进程,waitpid,wait
From: https://blog.csdn.net/2301_79789645/article/details/142153423

相关文章

  • 通过git进行本地项目代码备份与版本控制
    在本地进行项目开发时,由于代码需要进行多次迭代,因此备份代码是不可缺少的。因此使用版本控制系统来进行代码备份是很有必要的。本文将介绍有关git配置gitee以及github的相关内容,并对一些问题做出相应解释。1.git工具1.1git介绍Git是一个开源的分布式版本控制系统,可以有效、......
  • Linux下sysfs_procfs_debugfs使用
    1Linux下sysfs/procfs/debugfs使用Linux内核空间与用户空间的交互如何能透过文件系统这层关系,把需要参数写入文件中呢?当然有办法,linux内核提供了3种“内存文件系统”,分别是sysfs、debugfs、procfs,驱动工程师可以通过任意的一种文件系统向用户空间传递信息。Sysfs的挂载点为/s......
  • Linux的使用总结
    Linux1.Linux内核知识1.1内核源码目录路径存放内容/arch不同CPU架构下的核心代码。其中的每一个子目录都代表Linux支持的CPU架构,比如arm,x86,MIPS,PPC等/blockblock目录下放的是一些linux存储体系中关于块设备管理的代码;譬如说SD卡、iNand、Nand、硬盘等都是块设备。你......
  • Linux定时任务
    Linux定时任务1.定时任务概述定时任务:类似于我们闹钟,定时任务一般用于定期(分钟,小时,天)运行任务。一般用于运行重复性任务或工作.2.应用场景所有重复性的工作,都交给定时任务.1.定时同步时间ntpdate2.定时备份3.定时巡检4.其他的定时或重复需求3.定时任务使用3.1......
  • Linux进阶命令-echo&date&alias
    作者介绍:简历上没有一个精通的运维工程师。希望大家多多关注作者,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。经过上一章Linux日志的讲解,我们对Linux系统自带的日志服务已经有了一些了解。我们接下来将讲解一些进阶命令,主要从以下几个方面来讲解:一些系统操作,系......
  • 通过 Dll 注入实现应用层跨进程 inline 挂钩
    一、导入Detours库Detours是微软提供的一个开发库,可以简单、高效且稳定的实现APIhook。Detours是一个可以在x86、x64和IA64平台上挂钩任意win32函数的程序开发库,它通过在需要进行挂钩的目标函数头部重写内存代码而达到接管函数控制权,进而实现自己功能的目的。除此之......
  • Linux Debian12安装原生版微信
    1.原生版微信下载地址:https://archive.ubuntukylin.com/software/pool/partner/找到weixin,2022年05月23日最新版本,weixin_2.1.4_amd64.deb,下载。2.微信安装:sudodpkg-iweixin_2.1.4_amd64.deb3.登陆即可。......
  • Linux 网络性能指标
    目录网络性能指标查看网络配置查看socket信息查看网络吞吐率和PPS查看连通性和延时Linux网络协议栈是根据TCP/IP模型来实现的,TCP/IP模型由应用层、传输层、网络层和网络接口层,共四层组成,每一层都有各自的职责。应用程序要发送数据包时,通常是通过socket接口,于是就会发生系......
  • 数据处理与统计分析篇-day01-Linux基础与环境搭建
    day01-Linux基础计算机简介概述电子计算机,电脑,PC,Computer,就是由软件+硬件组成的电子设备.组成计算机硬件CPU(运算器,控制器)存储器(内存,外存)输入设备输出设备计算机软件系统软件:充当用户和计算机硬件之间的桥梁的.PC端:windows,......
  • scanpy计算n_genes_by_counts和total_counts等质量控制指标
    利用scanpy计算adata的obs中的质量控制指标(n_genes_by_counts,total_counts等参数指标)⚠️注意:只是计算相关质量控制指标,并不会筛选/过滤数据。需要用的包:scanpy和anndata导入包和读取adata数据importanndataimportscanpyasscimportpandasaspdimportnumpyasnpa......