Linux详解:进程等待

server/2024/10/18 14:01:55/

文章目录

  • 进程等待
    • 等待的必要性
    • 进程等待的方法
      • wait
      • waitpid
      • 获取子进程status
      • 阻塞等待 与 非阻塞等待

进程等待

等待的必要性

  • 子进程退出,父进程不进行回收的话,就可能造成僵尸进程,进而造成内存泄露

  • 如果进程进入了僵尸状态,kill也杀不掉这个进程。因为谁也杀不死一个已经死去的进程

  • 父进程派给子进程的任务完成的如何,使用者应该直到结果。子进程的任务是完成了还是未完成。

  • 父进程通过进程等待(wait)的方式,回收子进程的资源,获取子进程的退出信息

  • 父进程通过wait的方式,回收子进程的资源

    子进程的退出信息,保存在子进程的pcb中。

进程等待的方法

#include<sys/types.h>
#incldue<sys/wait.h>
pid_t wait(int *status);
pid_t waitpid(pid_t pid, int *status, int options);

wait

pid_t wait(int *status);
  • 默认进行阻塞等待,子进程没有退出,父进程就一直等待。
  • 等待父进程的任意一个子进程退出。
  • 返回值:
    • >0:等待成功,返回值是等待子进程的pid
    • <0:等待失败
  • 参数:输出型参数,获取子进程的退出状态,如果不关心则可以设置为NULL

frok之后,父子进程谁先运行,不确定,是由操作系统的调度器运行。但是谁最后退出是确定的,父进程一定要最后退出,因为要等待子进程运行结束之后回收子进程。

waitpid

pid_t waitpid(pid_t pid, int *status, int options);
  • 返回值:
    • >0:等待成功,返回值是等待子进程的pid
    • <0:等待失败
  • 参数
    • pid
      • pid=-1,等待人一个子进程,与wait等效
      • pid>0,等待其进程id与pid值相等的子进程
    • status:输出型参数,获取子进程的退出状态,如果不关心则可以设置为NULL
    • options:0、非阻塞

获取子进程status

  • wait和waitpid,都有一个status参数,这个参数是一个输出型参数,由操作系统进行填充
  • 如果传递NULL,表示不关心子进程的退出状态信息
  • 如果不是NULL,则操作系统会根据该参数,将子进程的退出信息反馈给父进程
  • status不能简单的当作整形来看待,应该当成位图来看,只考虑status的低16位。
status:0000 0000 0000 0000 0000 0000 0000 0000

信号编号进程退出码表示状态
00没有异常,结果正确
!00出现异常,退出码无意义
0!0没有异常,结果错误
!0!0出现异常,退出码无意义
0~7,进程出现异常,收到的信号编号
9~15,进程正常结束的退出码

信号编号:status&0x7F
退出码:(status >> 8)& 0xFF

status:

  • WIFEXITED(status):若为正常终止子进程返回的状态,则为真。(查看进程是否正常退出)。判定当前进程的退出信号是否为0,为0就为真,不为0就是假。
  • WEXITSTATUS(status):若WIFEXITED非零,提取子进程退出码。(查看进程的退出码)。

因为进程具有独立性,所以父子无法直接互相修改对方的数据之后,让对方看到。

因为读取子进程退出信息,本质上是读取内核数据,所以需要调用系统接口。

#include<sys/types.h>
#incldue<unistd.h>
#include<sys/wait.h>
int main()
{pid_t id = fork();if(id == 0){int cnt = 5;while(cnt){printf("child is running, pid:%d, ppid:%d",getpid(),getppid());sleep(1);cnt--;}exit(0);}int status = 0;pid_t rid = waitpid(id,&status,0);if(id>0){printf("wait success,rid:%d , status:%d, exitsigno:%d, exitcode    :%d\n",rid,status,(status&0x7F),((status>>8)&0xFF));}
}

阻塞等待 与 非阻塞等待

父进程阻塞等待,当子进程还在执行时,没有返回,父进程会将自己设置为阻塞状态,一直等待着子进程结束回收。

非阻塞等待,父进程检查子进程是否返回,如果子进程没有返回,不进行等待,父进程立刻返回,返回值为0。如果子进程已经返回,则返回子进程的id。

WNOHANG:若pid指定的子进程没有结束,则waitpid()函数返回0,不予等待,若正常结束,则返回该子进程的id。

单次调用:非阻塞

基于非阻塞的轮询访问

机器宕机了,操作系统没有反应 – hang住了


http://www.ppmy.cn/server/23993.html

相关文章

基于SSM的考研助手系统(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的考研助手系统&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring Spri…

Android Compose页面跳转Demo

1.引入依赖 //jetpack compose导航 implementation("androidx.navigation:navigation-compose:2.5.3") 2.代码 import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.compose.foundat…

强化学习Upper Confidence Bound策略笔记

UCB是一种强大的探索策略&#xff0c;它通过对每个动作的置信界限进行估计&#xff0c;在探索和利用之间取得平衡&#xff0c;以找到最优的动作选择策略。 Upper Confidence Bound&#xff08;UCB&#xff0c;上置信界限&#xff09;是一种用于解决多臂机问题的探索策略。它的核…

Java---数据类型与变量

1.字面常量 字面常量就是我们经常所说的常量&#xff0c;常量即在程序运行期间&#xff0c;固定不变的量。且常量是无法改变的&#xff0c;如果我们的代码有改变常量的操作&#xff0c;程序就会报错。 1.1字面常量的分类 字符串常量&#xff0c;整型常量&#xff0c;浮点数常…

鸿蒙开发实战:鸿蒙应用开发中的页面管理工具类详解

一、引言 在鸿蒙应用开发的征程中,如何高效地管理页面布局与显示,以满足用户对于沉浸式体验、个性化StatusBar颜色等界面特性的需求,一直是开发者们关注的焦点。为此,我特别设计了一款实用的“页面管理工具类”,它具备强大的功能,能帮助开发者轻松应对各种页面管理挑战。…

stable diffusion 的controlNet 安装和使用

stable diffusion 安装controlNet需要先下载扩展 扩展地址 下载了扩展以后&#xff0c;需要下载相应的模型&#xff0c;每个模型大约1.45G,可以按需下载。 模型地址 如果下载速度太慢&#xff0c;可以考虑去liblib下载&#xff0c;但是是全量模型 liblib 模型下载完后&#…

四、交换机高级特性

目录 1.MUX-VLAN 2.端口隔离 ①二层端口隔离 ②三层端口隔离 3.ARP代理 4.Super-VLAN&#xff08;VLAN聚合&#xff09; 5.QinQ 基于接口的 QinQ 封装&#xff08;基本QinQ、QinQ二层隧道&#xff09;&#xff08;不常用&#xff09; 基于流的 QinQ 封装&#xff08;灵…

elementui el-date-picker禁止选择今年、今天、之前、时间范围限制18个月

1、禁止选择今年之前的所有年份 <el-date-pickerv-if"tabsActive 0":clearable"false"v-model"yearValue"change"yearTimeChange"type"year"placeholder"选择年"value-format"yyyy":picker-options…