Linux操作系统学习(进程等待)

news2025/1/18 7:01:41

文章目录

  • 进程等待
    • 进程等待的必要性
    • 如何进程等待
      • wai
      • waitpid
    • 验证

进程等待

​ 我们知道fork函数可以创建一个子进程,而子进程通常是替父进程完成一些任务,而父进程在fork之后需要通过wait/waitpid等待子进程退出。这就是进程等待

进程等待的必要性

  • 通过获取子进程退出时的反馈信息,可以知道子进程执行的结果如何、
  • 可以保证时序问题,即先退出子,再退出父
  • 进程退出时会先进入僵尸状态,而僵尸状态不能被kill杀掉还浪费维护成本占用空间但不使用等等危害(内存泄漏),需要通过父进程wait/waitpid释放该子进程的资源

所以进程等待就是,子进程替父进程执行一些任务后结束,父进程要读取子进程执行结束后的反馈的等待,就是进程等待

如何进程等待

这里需要用到如下两个函数

wai

#include <sys/types.h> 
#include <sys/wait.h>
int wait(int *status)
  • 如果成功,wait会返回被收集的子进程的进程ID;
  • 如果调用进程没有子进程,调用就会失败,此时wait返回-1,同时errno被置为ECHILD。

这里只讲waitpid,wait比waitpid简单,会了下面的就会这个了


waitpid

#include <sys/types.h> 
#include <sys/wait.h>
pid_t waitpid(pid_t pid,int *status,int options);
参数(pid)功能
小于 -1等待进程组号为pid绝对值的任何子进程。
等于 -1等待任何子进程,此时的waitpid()函数就退化成了普通的wait()函数。
等于 0等待进程组号与目前进程相同的任何子进程,也就是说任何和调用waitpid()函数的进程在同一个进程组的进程。
大于 0等待进程号为pid的子进程。
参数(status输出型参数) 宏功能
WIFEXITED(status)如果子进程正常结束,它就返回真;否则返回假。
WEXITSTATUS(status)如果WIFEXITED为真,则可以用该宏取得子进程exit()返回的退出码。
WIFSIGNALED(status)如果子进程因为一个未捕获的信号而终止,它就返回真;否则返回假。
WTERMSIG(status)如果WIFSIGNALED为真,则可以用该宏获得导致子进程终止的信号码。
WIFSTOPPED(status)如果当前子进程被暂停了,则返回真;否则返回假。
WSTOPSIG(status)如果WIFSTOPPED为真,则可以使用该宏获得使子进程暂停的信号代码。

status这里只用16个bit位,正常退出时,可以读取到退出码,程序异常只能读取到终止信号

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

  • 如果传递NULL,表示不关心子进程的退出状态信息。

  • 否则,操作系统会根据该参数,将子进程的退出信息反馈给父进程。

  • status不能简单的当作整形来看待,可以当作位图来看待,具体细节如下图

  • 正常执行代码退出可以收到退出码,而退出信号为0

  • 而代码异常没跑完,可以读取到终止信号,但没有退出码

options参数 :参数options提供了一些另外的选项来控制waitpid()函数的行为。如果不想使用这些选项,则可以把这个参数设为0
一般常用的有两个
WNOHANG :如果pid指定的子进程没有结束,则waitpid()函数立即返回0,而不是阻塞在这个函数上等待;如果结束了,则返回该子进程的进程号。
WUNTRACED:如果子进程进入暂停状态,则马上返回。
waitpid的返回值
当返回正常时,waitpid返回收集到的子进程的进程ID
如果设置了WNOHANG,而调用中waitpid发现自己没有已退出的子进程可收集,则返回0;
如果在调用中出现错误,则返回-1,同时errno会被设置成相应的值来提示错误。

验证

wait

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>

void test1()
{
  pid_t id = fork();
  if(id == 0)
  {
    int count = 5;
    while(count)
    {
      printf("child run -> %d,child pid:%d \n",count,getpid());
      sleep(2);
      count--;
    }
    exit(0);
  }

  sleep(20);
  pid_t waitid = wait(NULL);
  if(waitid > 0)
  {
    int count = 5;
    while(count)
    {
      printf("child success. parent run->%d\n",count);
      sleep(1);
      count--;
    } 
  }
  else
    printf("waait error\n");
}


int main()
{
  test1();
  return 0;
}

下面来验证waitpdi

(1)status相关

只需把最上面的代码稍微修改即可,如下图所示:

status是输出型参数,操作系统会去读取退出码和信号

(2)options相关

(WNOHANG| WUNTRACED) 这两个参数的作用是非阻塞等待 (做自己的任务,并每一段时间检查一次)

参数置0则表示阻塞等待 (只做等待这一件事,直到等待结束,才去执行自己的)

从运行状态(队列)的task_struct放到等待队列中就叫做 挂起等待(阻塞),从等待队列放到运行队列被CPU调度就叫做唤醒进程

这里解释为什么命令行的指令能看到退出码:可以理解为命令行执行的指令说就是一个子进程,在bash下的子进程,所以每个指令都看作是一个进程,都有自己的退出码、终止信号

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

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

相关文章

Allegro如何导入第三方网表操作指导

Allegro如何导入第三方网表操作指导 在用Allegro做PCB设计的时候,除了支持第一方网表的导入,同样也是可以导入第三方网表的,第三方网表如下图 如何导入,具体操作如下 点击Setup点击User Preference

【抽水蓄能电站】基于粒子群优化算法的抽水蓄能电站的最佳调度方案研究(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5;&#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密…

Linux操作系统学习(进程替换)

文章目录进程替换进程替换是什么&#xff1f;替换的方法进程替换简易shell模拟进程替换 进程替换是什么&#xff1f; 如下图所示&#xff1a; ​ 进程替换就是&#xff0c;把进程B的代码和数据&#xff0c;替换正在执行的进程A的代码和数据在内存中的位置&#xff08;若代码…

etcd集群通过 Leader 写入数据,为什么K8s HA集群中讲每个 kube-apiserver 只和本机的 ETCD 通信

写在前面 对这个我不太明白&#xff0c;所有在 stackOverflow 的请教了大佬这里分享给小伙伴理解不足小伙伴帮忙指正 对每个人而言&#xff0c;真正的职责只有一个&#xff1a;找到自我。然后在心中坚守其一生&#xff0c;全心全意&#xff0c;永不停息。所有其它的路都是不完整…

spark sql(二)sql解析流程扩展

1、前言 通过前面的文章我们了解到&#xff0c;spark sql通过catalyst框架解析sql&#xff0c;而在将sql语句转变为可执行的任务过程中会将大的sql解析流程划分为未解析的逻辑计划、解析后的逻辑计划、优化后的逻辑计划、物理计划、可执行物理计划等阶段。大概的解析流程如下所…

Handler与线程

简介 Handler提供的种异步消息处理机制是&#xff1a;当它发出一个消息进入消息队列后&#xff0c;发送消息的函数立刻返回&#xff0c;接着主线程会逐个地从消息队列中把消息取出&#xff0c;然后对消息进行处理。明显&#xff0c;Handler发送消息和接收消息是异步进行的&…

三八送什么数码产品好?适合送礼的数码产品

数码产品是我们生活中比较常见到的物品&#xff0c;相比较于一般礼物的观赏性&#xff0c;它的实用性更强一些&#xff0c;所以如果你不知道送什么礼物给别人的话&#xff0c;数码产品也是不错的选择。 一、南卡小音舱蓝牙耳机 这个时代的女性&#xff0c;变得越来越自信了&am…

ChatGPT解答:根据使用者输入的字符串,自动判断规则,并给出各种正则表达式,用Python实现

ChatGPT解答&#xff1a; 根据使用者输入的字符串&#xff0c;自动判断规则&#xff0c;并给出各种正则表达式&#xff0c;用Python实现 根据输入的字符串&#xff0c;自动给出正则表达式 根据使用者输入的字符串&#xff0c;自动判断规则&#xff0c;并给出各种正则表达式&am…

JVM系统优化实践(7):垃圾回收器与垃圾回收算法

您好&#xff0c;我是湘王&#xff0c;这是我的CSDN博客&#xff0c;欢迎您来&#xff0c;欢迎您再来&#xff5e;上回说到了年轻代、老年代与数据计算的一个案例。接下来就先讲一讲年轻代和老年代的两个垃圾回收器&#xff1a;ParNew和CMS。和Serial垃圾回收器一样&#xff0c…

实战:yaml方式安装ingress-nginx-2023.3.2(测试成功)

实战&#xff1a;yaml方式安装ingress-nginx-2023.3.2(测试成功) 目录 文章目录实战&#xff1a;yaml方式安装ingress-nginx-2023.3.2(测试成功)目录实验环境实验软件1、安装过程2、第一个示例关于我最后最后实验环境 实验环境&#xff1a; 1、win10,vmwrokstation虚机&#x…

AI_News周刊:第四期

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 News 1.对抗“唤醒人工智能”马斯克招募团队开发 OpenAI 竞争对手 据两位直接了解这项工作的人士和另一位了解情况的人士透露&#xff0c;埃隆马斯克最近几周与人工智能研究人员接洽&#xff0c;商讨成…

详细分析什么是进程?如何理解进程状态?

什么是进程&#xff1f; 比较官方一点的回答是&#xff1a;当一个程序加载到内存的时候&#xff0c;就是一个进程。 但是这是不准确的回答&#xff0c;进程是怎么在内存中形成的&#xff0c;以及内存是如何管理进程的&#xff0c;是通过什么描述进程的&#xff1f;下面我们将…

Neo4j数据库部署配置

这里写目录标题一、neo4j图形数据库安装与部署1.1配置JDK运行环境&#xff08;注意jdk与neo4j版本对应&#xff09;1.2部署Neo4j&#xff08;注意jdk与neo4j版本对应&#xff09;二、数据库基本操作演示一、neo4j图形数据库安装与部署 1.1配置JDK运行环境&#xff08;注意jdk与…

centos安装rocketmq

centos安装rocketmq1 下载rocketmq二进制包2 解压二进制包3 修改broker.conf4 修改runbroker.sh和runserver.sh的JVM参数5 启动NameServer和Broker6 安装rockermq dashboard(可视化控制台)1 下载rocketmq二进制包 点击rocketmq二进制包下载地址&#xff0c;下载完成之后通过ft…

javaEE 初阶 — 数据链路层中的以太网数据帧

文章目录以太网帧格式1. MAC 地址2. MAC 地址是如何与 IP 地址相互配合的3. 以太网帧格式中的类型MTU&#xff08;了解&#xff09;以太网帧格式 数据链路层主要考虑的是相邻的两个结点之间的传输。 这里最知名的协议就是 以太网。 一个以太网数据帧有三个部分组成。帧头载荷…

【GlobalMapper精品教程】055:GM坐标转换器的巧妙使用

GM软件提供了一个简单实用的坐标转换工具,可以实现地理坐标和投影坐标之间的高斯正反算及多种转换计算。 文章目录 一、坐标转换器认识二、坐标转换案例1. 地理坐标←→地理坐标2. 地理坐标←→投影坐标三、在输出坐标上创建新的点四、其他转换工具的使用一、坐标转换器认识 …

653600-56-7,Ac4GaINAz,N-叠氮四酰化半乳糖用于PROTAC合成

基础产品数据&#xff1a;CAS号&#xff1a;653600-56-7中文名&#xff1a;N-叠氮四酰化半乳糖&#xff0c;叠氮修饰半乳糖英文名&#xff1a; Ac4GaINAzAc4GaINAz结构式&#xff08;Structural&#xff09;&#xff1a;详细产品数据&#xff1a;分子式&#xff1a;C16H22N4O10…

python学习——【第二弹】

前言 上一篇文章 python学习——【第一弹】给大家介绍了python中的基本数据类型等&#xff0c;这篇文章接着学习python中的运算符的相关内容。 运算符 python中的运算符主要有&#xff1a;算术运算符&#xff0c;赋值运算符&#xff0c;比较运算符&#xff0c;布尔运算符以及…

NPP夜间灯光遥感数据读取与可视化

1、Google Earth EngineGoogle Earth Engine是Google推出的行星尺度的遥感云计算平台&#xff0c;提供了大量遥感数据的集成与运算工具。同时也包括DMSP和NPP夜间灯光遥感数据&#xff08;月尺度和年尺度&#xff09;。这里给出样例的可视化代码。var dataset ee.ImageCollect…

1.2 CSS标签选择器,类选择器

CSS选择器&#xff1a; 根据不同的需求选出不同的标签&#xff0c;进行美化装饰 1. 标签选择器 标签选择器(元素选择器)&#xff1a;用 HTML标签名作为选择器&#xff0c;按标签名称进行分类&#xff0c;为页面某一类标签指定统一的CSS样式 作用: 可以把某一类标签全部选中&…