1.等待子进程系统调用 wait() 执行如下动作:1.如果调用进程并无之前未被等待的子进程终止,调用将一直阻塞,直到某个子进程终止。如果调用时已有子进程终止,wait() 则立即返回。2.如果 status 非空,那么关于子进程如何终止的信息则会通过 status 指向的整型变量返回。3.内核将会为父进程下所有子进程的运行总量追加进程 cpu 时间以及资源使用数据。4.将终止子进程的ID作为 wait() 的结果返回。2.waidpid(pid_t pid, int *status, int options)1.如果 pid > 0, 表示等待进程ID 为 pid 的子进程2.如果 pid = 0, 则等待与调用进程(父进程)同一个进程组的所有子进程3.如果 pid < -1, 则会等待进程组标识符与 pid 绝对值相等的所有子进程4.如果 pid = -1, 则会等待任意子进程。3.waitid();waitid() 与 waitpid() 最显著的区别在于,对于应等待的子进程事件,waitid() 可以更为精准的控制。4.wait3(),wait4()wait3, wait4 执行与 waitpid 类似的工作。主要语义区别在于, wait3 和 wait4 在参数 rusage 所指向的结构中返回终止子进程的资源使用情况。5.孤儿进程与僵尸进程父进程与子进程的生命周期一般不同,所以引出2个问题:1.谁会是孤儿进程的父进程? 进程 ID 为 1 init 会接管孤儿进程。换言之,某一子进程调用 getppid() 返回1,可以判断父进程是否存在。2.父进程在执行 wait 之前,子进程已经终止。系统仍然允许父进程调用 wait 获取该子进程是如何终止的。内核通过将子进程转化为僵尸进程来处理这种情况。这也意味着将释放子进程所把持的大部分资源,以便其他进程重新使用。该进程所唯一保留的便是内核进程表中的一条记录,其中包含了子进程的ID,终止状态,资源使用数据等。如果父进程未使用 wait 而退出,那么 init 进程将接管子进程并自动调用 wait,从而从系统中移除僵尸进程。如果父进程创建了一个子进程,但并未执行 wait,那么在内核的进程表中将为该子进程永远保留一条记录。如果存在大量此类僵尸进程,那么它们势必将填满内核进程表,从而阻碍新进程的创建。唯一的方法是,杀掉它们的父进程,此时 init 进程会接管和等待这些僵尸进程,从而从系统中将它们清楚。在设计长生命周期的父进程,父进程应该执行 wait 方法,以确保系统总是能够清楚那些死去的子进程,避免成为长寿僵尸。6.SIGCHLD 信号无论一个子进程何时终止,系统都会向其父进程发送 SIGCHLD 信号。如果相继有2个子进程终止,即产生了2次 SIGCHLD 信号,父进程也只能捕获一次。结束是,父进程的 SIGCHILD 信号处理程序每次只调用一次 wait(), 那么一些僵尸进程将成为漏网之鱼。解决方案:在 SIGCHILD 处理程序内部循环以 WNOHANG 标志来调用 waitpid() ,直至再无其他终止子进程需要处理为止。while( waitpid(-1, NULL, WNOHANG) > 0 )continue;上述循环会一直持续,直到 waitpid() 返回0,表明再无僵尸子进程存在。

26.Linux/Unix 系统编程手册(上) -- 监控子进程相关推荐

  1. linux/unix系统编程手册11-15

    title: linux/unix编程手册-11_15 date: 2018-05-27 11:53:07 categories: programming tags: tips linux/unix编 ...

  2. Linux/Unix系统编程手册 第三章:系统编程概念

    本章介绍系统编程的基础概念和一些后续章节用到的函数及头文件,并说明了可移植性问题. 系统调用是受控的内核入口,通过系统调用,进程可以请求内核以自己的名义去执行某些动作,比如创建子进程,执行I/O操作, ...

  3. Linux/UNIX系统编程手册gg

    Linux系统: "所见皆文件" 一个比较好的博客 一.Linux基础操作 Linux系统目录: bin:存放二进制可执行文件 boot:存放开机启动程序 dev:存放设备文件: ...

  4. Linux/Unix系统编程 五:进程

    进程是一个可执行程序的实例. 一.linux系统进程管理 1.进程管理的作用 判断机器健康状态 查看系统中所有进程 杀手进程 2.查看系统进程 1.ps -aux BSD操作系统格式: TTY说明: ...

  5. Linux系统编程手册-源码的使用

    Linux系统编程手册-源码的使用 转自:http://www.cnblogs.com/pluse/p/6296992.html 第三章后续部分重点介绍了后面章节所要使用的头文件及其实现,主要如下: ...

  6. 5w字总结 Unix系统编程学习笔记(面试向)(Unix环境高级编程/Unix环境程序设计)

    文章目录 一.计算 C语言的数据表示与处理 计算 C语言的基本运算操作 内存表和符号表 类型转换 函数类型的分析 指令 复合指令 句法 函数 函数激活(Activation Record) 函数激活定 ...

  7. ①Linux简明系统编程(嵌入式公众号的课)---总课时12h

    10.09 注意:这个是Linux高级编程的简明教程,是Linux应用程序的开发,而不是底层程序的开发. 内容是关于操作系统和网络编程的吗? Linux简明系统编程 〇.课程思维导图 〇.会用到的头文 ...

  8. LINUX C系统编程与PYTHON中的时间模块对比

    今天看python时间模块time的时候发现和LINUX系统编程中的时间调用函数基本一样,以前刚好没有好好学习LINUX C编程的时间模块就对比进行了学习. 本文只是给出函数接口和使用方式,详细了解请 ...

  9. 【Linux】系统编程之文件(标准I/O库)

    目录 一.文件I/O与标准I/O的区别(open与fopen) 1.来源 2.移植性 3.适用范围 4.文件IO层次 5.缓冲 二.函数fopen.fwrite.fread.fseek.fclose ...

  10. UNIX系统编程(1)

    注:本文来自"网易"博主,仅阅读,学习 第一章:什么是系统编程  UNIX系统编程,简单的说就是"C语言+系统调用(system call)",学会了C语言再知 ...

最新文章

  1. linux root权限_深入了解 Linux 权限
  2. cocos2d-x学习笔记 动作 CCCallFunc家族(回调函数包装器)
  3. AsyncTask知识整理笔记
  4. 感谢大家对我微软TECHED2013课程的支持
  5. java 修饰_Java 修饰符
  6. java解析ajax的数据_java ajax 请求后获取 json 数据 以及 使用 解析 ,解惑
  7. 存储过程/函数权限的问题解决(The user specified as a definer ('root'@'%') does not exist)...
  8. MSSQL从2000升级到2005丢失数据库关系图的解决方案
  9. 多态与异常处理——动手动脑
  10. c语言中static 用法
  11. mysql和虚拟主机区别_虚拟主机mysql
  12. 谁能谈谈国外软件行业的实际情况么?(全美“50大好差事” 软件工程师排名第一)...
  13. 解决IEEE会议模板引用bib文件时出现Bibliography not compatible with author-year citations
  14. mac执行java死卡_MacOS应用程序有时卡死,怎么办?2种方法轻松搞定
  15. Jepsen:分布式系统最早的混沌框架
  16. 多目标优化系列(一)NSGA-Ⅱ
  17. 如何设计一款高性能分布式锁,实现数据的安全访问?
  18. 动态ip代理:Python爬虫应用,八仙过海各显神通
  19. 如何使用熵值法分组计算核心指标权重,并为项目打分
  20. 计算机word打不原因什么意思,word打不开什么原因

热门文章

  1. WPF DataGrid 导出Excel
  2. intellij 专业版 TomCat9
  3. int indexs=(int)(_v+0.5);
  4. 项目总结【Excel中附件导出和导入】
  5. 计算机网络领悟摩尔定,计算机网络等133信息技术展望P15-P17.PPT
  6. think php 500错误,thinkPHP5配置nginx环境无法打开 ,每次都是报500错误
  7. BZOJ1827[USACO 2010 Mar Gold 1.Great Cow Gathering]——树形DP
  8. C++入门经典-例3.9-使用嵌套表达式判断一个数是否是3和5的整数倍
  9. 【转】前端开发中的MCRV模式
  10. Node.js学习(第一章:Node.js安装方法及模块化理解)