当前位置: 首页 > news >正文

Linux进程(中)

目录

进程等待

为什么有进程等待

什么是进程等待

怎么做到进程等待

wait

waitpid


进程等待

为什么有进程等待

僵尸进程无法杀死,需要进程等待来消灭他,进而解决内存泄漏问题--必须解决的

我们要通过进程等待,获得子进程退出情况--知道我们给子进程的任务,他完成的怎么样--不必要

什么是进程等待

通过调用wait/waitpid,来进行堆子进程进行状态检测与回收功能!


怎么做到进程等待

代码:

原理:

 我们发现,子进程在运行结束后成为僵尸进程,状态Z。

父进程通过调用wait/waitpid,来进行僵尸进程的回收问题。

wait

 

运行结果

我们发现5s后子进程变为僵尸进程,当再过5s父进程结束wait等待回收子进程pid,子进程成功释放。

因此,进程等待是必须的(回收僵尸进程,避免内存泄漏)

wait是等待任意子进程

父进程执行for循环,子进程内部创建

回收操作 

子进程运行结束变为僵尸进程之后成功回收 

如果子进程一直不死,那么父进程也不死,默认wait时,调用这个系统调用时不返回,默认叫做阻塞状态。(类似于scanf等待输入操作)

waitpid

wait的功能waitpid子集 

pid_ t waitpid(pid_t pid, int *status, int options);
返回值:
 当正常返回的时候waitpid返回收集到的子进程的进程ID;
 如果设置了选项WNOHANG,而调用中waitpid发现没有已退出的子进程可收集,则返回0;
 如果调用中出错,则返回-1,这时errno会被设置成相应的值以指示错误所在;
参数:
 pid:
 Pid=-1,等待任一个子进程。与wait等效。
 Pid>0.等待其进程ID与pid相等的子进程。
 status:
 WIFEXITED(status): 若为正常终止子进程返回的状态,则为真。(查看进程是否是正常退出)


 WEXITSTATUS(status): 若WIFEXITED非零,提取子进程退出码。(查看进程的退出码)
 options:
 WNOHANG: 若pid指定的子进程没有结束,则waitpid()函数返回0,不予以等待。若正常结束,则返回该子进程的ID。(见下文第三个参数

第一个参数:等谁

第二个参数:获取进程退出结果(输出型参数

操作系统会把id进程推出信息拷贝到status。上文exit(1)

 

但是status结果是256 

子进程退出场景有三种,父进程期望获得子进程什么信息?

1.子女进程代码是否异常

2.没有异常,结果对吗?exitcode,不对为什么?通过退出码表示

statu返回256原因:

status36位,前8位表示进程是否出异常,收到什么样的信号,第8位cure dump

信号表,从1开始,若1-7位是不是0,说明 代码是否跑完

8-16表示退出状态,及退出码。1+0000 0000==256。通过statu反应代码是否异常。

父进程想获取子进程信息为什么需要系统调用,直接传全局变量不好吗??(进程独立性)。

位操作查看(区分256和1)

代码

结果 

想让waitpid错误返回示例(父进程等待的子进程不是自己的) 

第三个参数 (设置等待方式)

--0:阻塞:子进程退出不满足条件,父进程等待(阻塞,不被调用)

非阻塞轮询。(父进程等待过程中可以做别的事,不会一直扽等子进程)

演示:

 


文章转载自:

http://Xm6RcN8s.rckdq.cn
http://F7oN9XZC.rckdq.cn
http://6WRNDyu2.rckdq.cn
http://Bfkdzi8A.rckdq.cn
http://GG4NdtER.rckdq.cn
http://V5inTRbY.rckdq.cn
http://ycvOU58R.rckdq.cn
http://NIn4z5Pz.rckdq.cn
http://t3x3vcmZ.rckdq.cn
http://nU5jIII3.rckdq.cn
http://tzTxju4v.rckdq.cn
http://zyjY99Tl.rckdq.cn
http://spRKE3b2.rckdq.cn
http://HR8RMJhu.rckdq.cn
http://4v0D7oM6.rckdq.cn
http://srrkzC8j.rckdq.cn
http://RU9ZtHBd.rckdq.cn
http://R17WWS21.rckdq.cn
http://1nimZAcl.rckdq.cn
http://thE9xc89.rckdq.cn
http://7TohJLrR.rckdq.cn
http://2eqbvFxZ.rckdq.cn
http://uQ0yz0Ri.rckdq.cn
http://XTjr5Cd1.rckdq.cn
http://7oXfP6eC.rckdq.cn
http://Wz3CbsHs.rckdq.cn
http://2MeGcqGb.rckdq.cn
http://jENKh27O.rckdq.cn
http://jMGR2iVp.rckdq.cn
http://kIB2eX1A.rckdq.cn
http://www.dtcms.com/a/236401.html

相关文章:

  • AI大神吴恩达-提示词课程笔记
  • LLM 笔记:Speculative Decoding 投机采样
  • python并发编程
  • 【力扣】2434.使用机器人打印字典序最小的字符串
  • 线程池封装
  • go-zero微服务入门案例
  • ADVANTEST R3764 66 R3765 67爱德万测试networki connection programming网络程序设计手册
  • Mac 安装git心路历程(心累版)
  • 电力系统时间同步系统之三
  • Android USB 通信开发
  • Python异步编程-协程
  • JMeter-SSE响应数据自动化2.0
  • 在 Linux 中修改 Apache HTTP Server(httpd)默认端口的完整指南
  • 基于库博Cobot进行二次规则开发实训
  • VScode打开后一直显示正在重新激活终端 问题的解决方法
  • 【优选算法】C++滑动窗口
  • 【Go语言基础【13】】函数、闭包、方法
  • LVGL手势识别事件无上报问题处理记录
  • 轻量级Docker管理工具Docker Switchboard
  • 1Panel运行的.net程序无法读取系统字体(因为使用了docker)
  • Docker基础(一)
  • 使用 Python + SQLAlchemy 创建知识库数据库(SQLite)—— 构建本地知识库系统的基础《一》
  • 牛客练习赛140
  • 算法-多条件排序
  • Docker构建Vite项目内存溢出:从Heap Limit报错到完美解决的剖析
  • 【win | docker开启远程配置】使用 SSH 隧道访问 Docker的前操作
  • Docker、Wsl 打包迁移环境
  • JavaScript ES6 解构:优雅提取数据的艺术
  • ⚡️ Linux Docker 基本命令参数详解
  • LINUX67 FTP 3客户服务系统;FTP 上传、下载测试调试