Linux 进程等待

在2号手册里查wait()。wait()等待任意一个子进程的状态。

wait()等待成功会返回该子进程的id,返回失败会返回-1:

小实验     子进程的退出码

子进程执行work(),父进程wait子进程。

子进程跑完5秒之后就exit(0)退出。

子进程跑的时候是run状态

当子进程跑完,父进程接收到子进程的状态,即僵尸状态,然后父进程会跑10秒,10秒过后父进程也结束进程。

代码如下:

#include<sys/types.h>
#include<sys/wait.h>
#include<unistd.h>
#include<stdlib.h>
#include<stdio.h>void work()
{int cnt=5;    while(cnt--)    {    printf("子进程开始启动:pid:%d,ppid:%d,cnt:%d\n",getpid(),getppid(),cnt);    sleep(1);    }    
}    int main()    
{    sleep(10);    pid_t id=fork();    if(id==0)      //子进程{    work();                                                                                                                                        exit(0);    }    else //父进程{pid_t ret=wait(NULL);    if(ret==id)    {printf("wait success,pid:%d\n",getpid());}
}sleep(10);return 0;}
~

结论:子进程在跑,父进程就要进行阻塞等待。等子进程跑完,父进程才wait sucess,总结如下:

waitpid()

用法:

 三个参数,重点讲一下  stauts

status是输出型参数,所谓输出型参数需要用户自己定义变量,然后传参,操作系统接收这个参数经过操作之后再返回给用户级变量

如下,定义一个int型变量,变量名为status,取地址传参,然后等如果父进程等待子进程之后就把status的值打印出来看看:

结果如下:

status是一个整形,有32位,分为高八位和低八位:

 如果进程正常退出,就返回低八位的0,高八位的退出状态。

如果异常退出,就返回低七位的终止信号,为什么不是低八位呢? 低八位的第一位是core dump标志,所以只返回低七位。

如下,我们把子进程的退出码改为exit(10),再让父进程去等待:
运行结果:status为2560。

因为退出码10的二进制为1010,又因为异常所以在高八位,如下:

转化为十进制就是2560;








exit sign为stautus的信号退出码,exit code为status的进程退出码:

printf("wait success,pid:%d,status返回码:%d, exit sign:%d    ,exit code:%d\n",getpid(),ret,status&0x7F,(status>>8)&0xFF);      

为什么exit sign是 status&0x7F?

因为信号退出码在低七位  7是3个1,F是4个1,合起来就是7个1,&7个1就把低七位保留,其他位全变0

同理,exit code为高八位  

运行结果:

退出信号为0,退出码为10、

如果我们把子进程的退出码改为正常退出码,即0,再跑,就会退出信号为0,退出码为0:

我们给子进程写一个除0错误:

 退出信号会显示8:

我们让子进程出现空指针错误:

退出信号为11:11就是段错误:

第二个实验  手动退出

我们让子进程不要退出了,一直运行:

此时运行之后子进程就会一直跑,然后我们输入kill -9 pid终止进程,进程退出信号会显示9:

小结

父进程得到子进程的退出结果实际上是调用stautus这个整型变量,可以用一个指针解引用即可得到status。

WIFEXITED    WEXITSTAUS

 用这两个宏就我们就可以不用关注返回值,宏会自己获取子进程的返回值。

调用WIFEXITED获取是否正常退出,如果为假,直接输出else里面的异常。

如果为真,就调用WEXITSTAUS获取子进程的退出码并打印出来。

我们可以先搞一个异常出来,把子进程死循环:

运行:

我们再把子进程改为正常的再运行:

非阻塞轮巡/非阻塞等待

与阻塞式等待相对。

阻塞式等待父进程什么事情也不干,就在那等着子进程返回值。

阻塞式等待可以干自己的事情,等子进程返回的时候接收一下就可以了。

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

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

相关文章

GCANet_Gated context aggregation network for image dehazing and deraining

2019、中科大港科、有代码 Chen D, He M, Fan Q, et al. Gated context aggregation network for image dehazing and deraining[C]//2019 IEEE winter conference on applications of computer vision (WACV). IEEE, 2019: 1375-1383. GitHub - cddlyf/GCANet: Implementation…

丢掉破解版,官方免费了!!!

哈喽&#xff01;大家好。 几天不见&#xff0c;今天给大家带来一款海外的神器&#xff0c;官方宣布完全免费&#xff0c;但仅限于个人与教育用途&#xff0c;切勿商用噢&#xff01; 不要看这个软件名字普普通通&#xff0c;实际上内蕴乾坤&#xff01; 接下来看我给大家炫一…

队列的实现和OJ练习(c语言)

目录 概念 队列的实现 利用结构体存放队列结构 为什么单链表不使用这种方法&#xff1f; 初始化队列 小提示&#xff1a; 队尾入队列 队头出队列 获取队头元素 获取队尾元素 获取队列中有效元素个数 检测队列是否为空 销毁队列 最终代码 循环队列 队列的OJ题 …

元素清空操作clear与选择操作check

元素清空操作clear与选择操作check clear() 作用 清空输入框的所有内容.clear() 等价于 .type("{selectall}{backspace}") 语法 .clear() .clear(options)option选项 元素选中操作check与uncheck check 语法 // 所有匹配到的选择框都会被选中一遍 .check()/…

CISP模拟考试(二)

免责声明 文章仅做经验分享用途,利用本文章所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,作者不为此承担任何责任,一旦造成后果请自行承担!!! 1.DDoS攻击主要目的是: A.破坏完整性 B.破坏机密性 C.破坏可用性 D.破坏不可抵赖性 答案:…

三、防火墙-源NAT

学习防火墙之前&#xff0c;对路由交换应要有一定的认识 源NAT基本原理1.1.NAT No-PAT1.2.NAPT1.3.出接口地址方式&#xff08;Easy IP&#xff09;1.4.Smart NAT1.5.三元组 NAT1.6.多出口场景下的源NAT 总结延伸 ——————————————————————————————…

C语言prim算法求最小生成树

Prim算法是一种用于寻找无向带权图的最小生成树的算法。该算法的基本思想是从一个源点开始&#xff0c;逐步向外扩展生成树&#xff0c;每次找到与当前生成树最近的未被访问的顶点&#xff0c;并将其加入到生成树中&#xff0c;直到所有顶点都被加入到生成树中为止。 具体来说…

部署你的第一个应用

&#x1f5d3;️实验环境 OS名称Microsoft Windows 11 家庭中文版系统类型x64-based PCDocker版本Docker version 24.0.6, build ed223bcminikube版本v1.32.0 &#x1f913;FastAPI 构建应用 #基于fastapi快速创建一个项目 rkun1LAPTOP-TUS5FU0D MINGW64 / $ mkdir k8s-appr…

1688 API接口测试指南

本文为您提供1688 API接口的测试指南。我们将介绍1688 API的基本概念&#xff0c;详解测试步骤&#xff0c;并为您提供一系列的最佳实践&#xff0c;以确保您在与1688平台进行API交互时能够获得最佳的效果和稳定性。 一、了解1688 API 1688 API是1688平台为开发者提供的一套用…

数学建模之拟合及其代码

发现新天地&#xff0c;欢迎访问Cr不是铬的个人网站 引言 与插值问题不同&#xff0c;在拟合问题中不需要曲线一定经过给定的点。拟合问题的目标是寻求一个函数&#xff08;曲线&#xff09;&#xff0c;使得该曲线在某种准则下与所有的数据点最为接近&#xff0c;即曲线拟合…

基于跳蛛算法优化概率神经网络PNN的分类预测 - 附代码

基于跳蛛算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于跳蛛算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于跳蛛优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神经网络的光滑…

7_画图常用代码

plt.figure(dpi200) # 设置 dpi 为 200&#xff08;可以根据需要调整这个值&#xff09;

数据结构学习笔记——多维数组、矩阵与广义表

目录 一、多维数组&#xff08;一&#xff09;数组的定义&#xff08;二&#xff09;二维数组&#xff08;三&#xff09;多维数组的存储&#xff08;四&#xff09;多维数组的下标的相关计算 二、矩阵&#xff08;一&#xff09;特殊矩阵和稀疏矩阵&#xff08;二&#xff09;…

从权限跳转看Activity的data android:scheme

在应用申请悬浮窗权限的时候&#xff0c;可以跳转到相应的设置界面&#xff0c;并且自动切换到应用的条目&#xff0c;高亮显示一下&#xff0c; android悬浮窗权限怎么申请 在Android中&#xff0c;要申请悬浮窗权限&#xff0c;需要以下步骤&#xff1a; 在 AndroidManifes…

hp惠普Victus Gaming Laptop 15-fa1025TX/fa1005tx原装出厂Win11系统ISO镜像

光影精灵9笔记本电脑原厂W11系统22H2恢复出厂时开箱状态一模一样 适用型号&#xff1a;15-fa1003TX&#xff0c;15-fa1005TX&#xff0c;15-fa1007TX&#xff0c;15-fa1025TX 链接&#xff1a;https://pan.baidu.com/s/1fBPjed1bhOS_crGIo2tP1w?pwduzvz 提取码&#xff1a…

每天一道算法题(十一)——滑动窗口最大值_困难(中等)

文章目录 1、问题2、示例3、解决方法&#xff08;1&#xff09;方法1——双指针 总结 1、问题 给你一个整数数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗…

c++ 函数的申明

1 一个cpp中 两种情况 1.1 定义 使用 1.2 声明 使用 定义 2 按 定义 后 直接使用的顺序 不用 声明 函数 #include <iostream> using namespace std;int max(int a, int b) {int max a>b?a:b;return max; }int main() {int a 1;int b 2;cout << max(a, b…

解决vue中引入天地图显示不全问题,设置setTimeout即可解决!

index.html中引入天地图api <script type"text/javascript" src"https://api.tianditu.gov.cn/api?v4.0&tk你的key"></script>map.vue中初始化天地图 //初始化天地图 initTMap() {const T window.T;// 3.初始化地图对象this.tMap new…

flink1.13.6版本的应用程序(maven版)

问题 想要一个指定flink版本的java计算任务hello world最简工程。 解决 mvn archetype:generate \-DarchetypeGroupIdorg.apache.flink \-DarchetypeArtifactIdflink-quickstart-java \-DarchetypeVersion1.13.6这里直接使用官方mave模版工程&#xff0c;指…

系统架构设计:13 论基于构件的软件开发

论基于构件的软件开发 软件系统的复杂性不断增长、软件人员的频繁流动和软件行业的激烈竟争迫使软件企业提高软件质量、积累和固化知识财富,并尽可能地缩短软件产品的开发周期。 集软件复用、分布式对象计算、企业级应用开发等技术为一体的“基于构件的软件开发”应运而生,…