Linux学习_进程等待和替换

1.进程等待

概述:父进程通过进程等待的方式,回收子进程资源,获取子进程退出信息

1.1等待方法

wait:
#include<sys/types.h>
#include<sys/wait.h>
pid_t wait(int*status);
返回值:
        成功返回被等待进程pid ,失败返回 -1
参数:
        输出型参数,获取子进程退出状态, 不关心则可以设置成为 NULL
waitpid:
#include<sys/types.h>
#include<sys/wait.h>
pid_ t waitpid(pid_t pid, int *status, int options);
返回值:
        当正常返回的时候waitpid 返回收集到的子进程的进程 ID
        如果设置了选项WNOHANG, 而调用中 waitpid 发现没有已退出的子进程可收集 , 则返回 0
         如果没设置WNOHANG,则表示检测成功,但是子进程还没退出,需要重复等待
        如果调用中出错, 则返回 -1, 这时 errno 会被设置成相应的值以指示错误所在;
参数:
pid:
        Pid=-1,等待任一个子进程。与 wait 等效。
        Pid>0.等待其进程 ID pid 相等的子进程。
status:
        WIFEXITED(status): 若为正常终止子进程返回的状态,则为(查看进程是否是正常退出)
        WEXITSTATUS(status): 若 WIFEXITED 非零,提取子进程退出码(查看进程的退出码)
options:
        WNOHANG: 若 pid 指定的子进程没有结束,则 waitpid() 函数返回 0 ,不予以等待。若正常结束,则返回该子进程的ID(非阻塞式等待 )

 

总结:
如果子进程已经退出,调用wait/waitpid时,wait/waitpid会立即返回,并且释放资源,获得子进程退出信息
如果在任意时刻调用wait/waitpid
,子进程存在且正常运行,则进程可能阻塞。 如果不存在该子进程,则立即出错返回

1.2获取子进程status

wait waitpid ,都有一个 status 参数,该参数是一个输出型参数,由操作系统填充
如果传递 NULL ,表示不关心子进程的退出状态信息。否则,操作系统会根据该参数,将子进程的退出信息反馈给父进程。status不能简单的当作整形来看待,可以当作位图来看待,具体细节如下
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
int main( void )
{
 pid_t pid;
 if ( (pid=fork()) == -1 )
     perror("fork"),exit(1);
 if ( pid == 0 ){
     sleep(20);
     exit(10);
 } else {
     int st;
     int ret = wait(&st);
     if ( ret > 0 && ( st & 0X7F ) == 0 ){ // 正常退出
         printf("child exit code:%d\n", (st>>8)&0XFF);
     } else if( ret < 0 ) { // 异常退出
         printf("sig code : %d\n", st&0X7F );
     }
  }
}
 //./a.out //等20秒退出
 //child exit code:10 
 //./a.out //在其他终端kill掉
 //sig code : 9

 2.进程程序替换

2.1替换原理

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

2.2替换函数

这些函数如果调用成功则加载新的程序从启动代码开始执行 , 不再返回
如果调用出错返回 -1,所以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[]);
int execve(const char *path, char *const argv[], char *const envp[]);

事实上 , 只有 execve 是真正的系统调用 ,其它五个函数最终都调用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);
}

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

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

相关文章

【MATLAB基础】频谱分析

01.引言 频率是单位时间内某事件重复发生的次数,用ω表示,单位是赫兹(Hz)。设m时间内某事件重复发生n次,则此事件发生的频率ω为一。又因为周期定义为重复事件发生的最小时间间隔,故频率也可以表示为周期的倒数:ωn/m,T表示周期。频率是一个很重要的概念,在工程数学中常用于分…

BST:一款功能强大的二进制字符串代码格式转换工具

关于BST BST是一款功能强大的二进制字符串代码格式转换工具&#xff0c;该工具可以将二进制字符串转换为能够兼容不同语言源代码的各种格式&#xff0c;以满足各种安全开发领域中的渗透测试或漏洞利用开发场景。 功能介绍 1、将二进制文件转换并转储为二进制字符串格式的标准输…

leaflet 显示地图加载的瓦片的行列号

背景&#xff1a; 在开发过程中&#xff0c;对接wmts服务的时候&#xff0c;调试参数过程中有时候需要直观看到当前地图加载的瓦片的行列号。 实现原理&#xff1a; 利用Leaflet的L.GridLayer图层&#xff0c;加载一个网格图层&#xff0c;重写其createTile方法&#xff0c;…

开源AI图像识别:支持文件批量识别快速对接数据库存储

随着数字化转型的不断深入&#xff0c;图像识别技术在各行各业中的应用越来越广泛。文件封识别作为图像识别技术的一个分支&#xff0c;能够有效地提高文件处理的自动化程度和准确性。本文将探讨文件封识别技术的原理、应用场景以及如何将识别后的内容批量对应数据库字段进行存…

Blast生态借贷协议Pac Finance陷“清算”风波,兄弟项目ParaSpace曾上演内斗

Blast生态协议又出事了。4月11日晚间&#xff0c;有用户发现借贷协议Pac Finance上出现了大量ezETH清算&#xff0c;涉及金额达2400 万美元。官方回应称&#xff0c;系一位智能合约工程师的操作导致Pac Finance发行清算阈值在没有事先通知团队的情况下被意外更改。 目前社区内…

dPET论文笔记

PBPK论文笔记 题目&#xff1a;Self-supervised Learning for Physiologically-Based Pharmacokinetic Modeling in Dynamic PET 摘要 动态正电子发射断层扫描成像 &#xff08;dPET&#xff09; 提供示踪剂的时间分辨图像。从 dPET 中提取的时间活动曲线 &#xff08;TAC&a…

办公提效-截图录屏

使用感受:滚动截图,目前用着pixpin最方便,简单可控制,有点类似qq截图。faststone容易在长截图出错,显示重复,而share X截不了大模型聊天记录。 我的办公工作流-截图录屏:pixpin截图且识别、录屏gif格式,faststone录屏成mp4格式,截图提取文字技术为OCR文字识别,短截图…

C语言基础:回顾判断素数

什么是素数&#xff08;也称质数&#xff09;&#xff1f;和合数相对。 其特点是只能被 1 和它本身 整除&#xff0c;无法被其他整数整除。或者公因数只有它自己和1两个数的数 怎么求解素数呢&#xff1f;对于求解质数的方法很多&#xff0c;但是有一种专门求解素数的功能&am…

Harmony鸿蒙南向外设驱动开发-Camera

功能简介 OpenHarmony相机驱动框架模型对上实现相机HDI&#xff08;Hardware Device Interface&#xff09;接口&#xff0c;对下实现相机Pipeline模型&#xff0c;管理相机各个硬件设备。 该驱动框架模型内部分为三层&#xff0c;依次为HDI实现层、框架层和设备适配层。各层基…

python--对象序列化和反序列化以及with语句块的使用

1.对象序列化和反序列化 对象序列化&#xff1a;将对象这种抽象概念转化为可以传输存储的物理概念 对象反序列化&#xff1a;将磁盘或者网络间的物理数据转化为对应的编程语言的对象 对象持久化&#xff1a;将对象永久的存储下来 对相反持久化&#xff1a; 将磁盘上永久存储…

Spring启动流程和循环依赖

文章目录 概览对Spring的理解Spring启动流程Spring循环依赖与三级缓存 概览 Spring是一个轻量级的Java开源框架&#xff0c;为了解决企业应用开发的复杂性而创建的。Spring的核心是控制反转&#xff08;IOC&#xff09;和面向切面&#xff08;AOP&#xff09;。 简单来说&…

性能优化 - 你知道CSS有哪些优化方案吗

难度级别:中高级及以上 提问概率:70% CSS是前端开发工作中必不可少的技能之一,同时也是网页开发中必不可少的重要元素之一。但很多人所开发的项目本身对性能要求并不高,再加上项目周期紧张,久而久之,也就容易养成不考虑细节的习惯,觉得C…

从0开始创建单链表

前言 这次我来为大家讲解链表&#xff0c;首先我们来理解一下什么是单链表&#xff0c;我们可以将单链表想象成火车 每一节车厢装着货物和连接下一个车厢的链子&#xff0c;单链表也是如此&#xff0c;它是将一个又一个的数据封装到节点上&#xff0c;节点里不仅包含着数据&…

NzN的数据结构--二叉树part2

上一章我们介绍了二叉树入门的一些内容&#xff0c;本章我们就要正式开始学习二叉树的实现方法&#xff0c;先三连后看是好习惯&#xff01;&#xff01;&#xff01; 目录 一、二叉树的顺序结构及实现 1. 二叉树的顺序结构 2. 堆的概念及结构 3. 堆的实现 3.1 堆的创建 …

90天玩转Python—10—基础知识篇:函数详解

90天玩转Python系列文章目录 90天玩转Python—01—基础知识篇:C站最全Python标准库总结 90天玩转Python--02--基础知识篇:初识Python与PyCharm 90天玩转Python—03—基础知识篇:Python和PyCharm(语言特点、学习方法、工具安装) 90天玩转Python—04—基础知识篇:Pytho…

循环单链表算法库

学习贺老师数据结构 数据结构之自建算法库——循环单链表_循环单链表 csdn-CSDN博客​​​​​​ 整理总结出的循环单链表算法库 v1.0 : 基本实现功能 v2.0(2024.4.6): 修复Delete_SpecificLocate_CyclicList()删除节点函数bug,添加验证删除节点是否超范围判断 目录 1.主要功能…

Blender2.83 下载地址及安装教程

Blender是一款开源的3D计算机图形软件&#xff0c;广泛应用于动画制作、游戏开发、建模、渲染等领域。它提供了一套强大的工具和功能&#xff0c;让用户能够进行三维建模、动画制作和视觉效果的创作。 Blender支持多种文件格式的导入和导出&#xff0c;使用户能够与其他软件进…

【Linux源码学习】(一)源码下载、解压说明

目录 一、Linux源码下载地址 二、使用7z解压 一、Linux源码下载地址 官网下载&#xff1a;The Linux Kernel Archives 我们可以到这个地址下载各种版本的压缩包&#xff1a;即上图对应的http网址。 Index of /pub/ 选择Linux 找内核代码 这里直接选择最新的6.x 然后往下翻&…

《猎灵online》游戏完整源码(源码+客户端+服务端+文档+工具),云盘下载

《猎灵》是一款由国内知名开发运营开发的大型3D魔幻网游&#xff0c;《猎灵》研发团队突破诸多瓶颈&#xff0c;首创“全自由无限制PK”&#xff0c;让玩家拒绝无意义等待&#xff0c;自由作战不受任何束缚&#xff0c;真正的实现想战就战&#xff0c;游戏创建了六界神魔乱斗的…

单调栈用法

文章目录 1. 单调栈1.1 理解单调栈&#xff08;模板&#xff09;1.2 每日温度1.3 子数组的最小值之和1.4 柱状图中最大的矩形1.5 最大矩形1.6 最大宽度坡1.7 去除重复字母 1. 单调栈 单调栈经典的用法&#xff1a; 对每个位置都求&#xff1a; 当前位置的左侧比当前位置的数…