一、wait

wait 函数 :阻塞函数,使进程一直处于等待状态,直至进程死亡。
(1)头文件:

#include <sys/types.h>
#include <sys/wait.h>

(2)函数使用:

pid_t wait(int *status);

参数用于判断子进程的死亡原因。
正常死亡:return 0 exit(1)
信号杀死:kill -9 pid
详细如下代码所示:

int status; // 传出参数
pid_t wpid = wait(&status);
if(WIFEXITED(status)) // WIFEXITED(status) 非 0,说明程序正常结束
{printf(“exit value : %d\n”, WEXITSTATUS(status)); // 结果是 return 或 exit 的值
}
else if(WIFSIGNALED(status)) // WIFSIGNALED(status) 非 0,说明程序异常终止,信号杀死
{printf(“kill by Signal: %d\n”, WTERMSIG(status)); // 结果说明是被几号信号杀死的
}

若不关心死亡原因可简化使用方法:wait(NULL);
(3)返回值类型:pid_t
返回值 = -1 表示失败,意味着没有子进程,回收结束。
返回值 > 0 返回值是被回收子进程的 pid。
注意:wait 函数一次只能回收一个子进程,回收多个子进程需要循环(注意判断条件)

while( ( wpid = wait(&status) ) != -1) { 判断死亡原因 } // 关心死亡原因
while( ( wpid = wait(NULL) ) != -1) { } // 不关心死亡原因

二、waitpid

waitpid 函数可以设置非阻塞。
(1)函数使用:

pid_t waitpid(pid_t pid, int *status, int options);

(2)
参数 pid_t pid:
当pid=-1:回收任意一个子进程
当pid> 0:回收进程 ID 等于 pid 的子进程(定向回收)
参数 status: 用于判断死亡原因,同 wait 函数
参数 options:设置为 0表示阻塞; 设置为 WNOHANG表示非阻塞。

(3)
返回值 > 0 :被回收子进程的 pid。
返回值 =-1 :回收结束。
返回值 = 0 :设置为 WNOHANG 会出现,且还有子进程正在运行,没有退出 。
注意:waitpid 函数一次也只能回收一个子进程,回收多个子进程需要循环。代码如下:

while( ( wpid = waitpid(-1,&status, WNOHANG) ) != -1)
{if(wpid == 0) {continue; // 子进程还在运行,所以没必要执行下面的代码
}
printf(“child died pid = %d\n”,wpid);
if(WIFEXITED(status)) {printf(“exit value : %d\n”, WEXITSTATUS(status));
}
else if(WIFSIGNALED(status)) {printf(“kill by Signal: %d\n”, WTERMSIG(status));
}
}

Linux学习之系统编程篇:进程回收(wait / waitpid)相关推荐

  1. Linux学习之系统编程篇:利用管道进行进程间通信

    这里我们先补充一个小知识: 父子进程使用 pipe 进行通信时fork 和 pipe 先后的顺序是先 pipe,后 fork,因为父进程先创建管道,再 fork 创建子进程,这样才能是父子进程共享一块 ...

  2. Linux学习之系统编程篇:ps 和 kill 命令以及父子进程间数据共享模式

    一.ps 和 kill 命令 1.ps 命令 常用方式: ps aux :查看正在运行进程信息(主要查 pid). ps ajx :更加详细(PID. PPID:父进程 id. PGID:进程组 id ...

  3. Linux学习之系统编程篇:编写一个守护进程

    需求:写一个守护进程,每隔 2s 获取一次系统时间,将这个时间写入到磁盘文件 #include <stdio.h> #include <stdlib.h> #include & ...

  4. Linux学习之系统编程篇:守护进程(精灵进程、后台进程)

    一.背景 一般情况下,启动终端(shell),系统会创建一个会话(shell 进程是会长),经过后续各种操作,该会话中会存在多个进程组,每个进程组中也会有多个进程(父进程是组长),若此时关闭 shel ...

  5. Linux学习之系统编程篇:利用 SIGCHLD 回收子进程

    子进程死亡会给父进程发送 SIGCHLD 信号!(默认动作:父进程忽略该信号)此时父进程就可以捕捉该信号,利用回调函数使用 waitpid 回收子进程. #include <stdio.h> ...

  6. Linux学习之系统编程篇:孤儿进程和僵尸进程(描述对象都是子进程)

    一.孤儿进程 孤儿进程:不是没有爹!会被领养. 过程:爹先死,孩子还活着,孩子称为孤儿进程. 注意:孤儿会被 init 进程领养(init 进程是所有孤儿进程的父进程). 设计领养目的:为了子进程结束 ...

  7. Linux学习之系统编程篇:循环创建多个子进程练习

    #include <stdio.h> #include <stdlib.h> #include <unistd.h> int main() {int num = 5 ...

  8. Linux学习之系统编程篇:PCB( 进程控制块)、进程状态、转换和控制

    一.PCB PCB 本质是一个超大的结构体 PCB 结构体中重要属性: (1) 进程 pid :进程的唯一编号,类型 pid_t,无符号整形. (2) 进程状态:就绪.运行.挂起.停止. (3) CP ...

  9. Linux学习之系统编程篇:程序、进程、并发、并行

    一.程序和进程 (1)程序: 本质:二进制文件,可以运行,但还没有运行,占用磁盘空间,不占用 CPU 和内存(系统资源). (2)进程: 本质:正在执行的程序,占用 CPU 和内存等更多的系统资源,一 ...

最新文章

  1. 首次吃了一颗带奶糖味的消炎药,不知道管用不
  2. 概率潜在语义分析(pLSA) 相关知识
  3. 保镖机器人作文_我的小保镖作文500字
  4. AI应用开发基础傻瓜书系列2-神经网络中反向传播与梯度下降的基本概念
  5. 刀剑神域动漫网页设计作品 学生表格布局网页作业成品 table漫画网站制作 dreamweaver静态HTML学生网页制作模板
  6. ckeditor3 配置
  7. bzoj3993 [SDOI2015]星际战争 二分答案+网络流检验
  8. Failed to find provider null for user 0; expected to find a valid ContentProvider for this authority
  9. base64编码的图片字节流存入html页面中的显示
  10. MySQL增量备份恢复和基于时间点与位置的恢复
  11. 在SSRS报表中,显示图片
  12. 关于在VC + + 2008 VCRedist安装时生成在根目录下的临时文件
  13. sql2000 mysql_sql2000迷你版 超精简版SQL Server 2000数据库下载
  14. in module XXX. File is included in 4 contexts
  15. ANSYS 有限元分析 概述
  16. 如何制作出漂亮精致的思维导图?MindNow来帮你
  17. 你未来的职业规划是什么?
  18. win 10键盘快捷方式就是按键或按键组合(收藏使用
  19. 我们肯定需要开发自己的BOL和GENIL
  20. kong笔记——kong/konga的搭建

热门文章

  1. 前端生成Excel 表格
  2. 层次分解位置编码,让BERT可以处理超长文本
  3. 偶像剪辑,一键获取:多模态联合建模的视频人物摘要
  4. DeepLabv3+:语义分割领域的新高峰
  5. 【归并排序】-求逆序数算法
  6. python通过cookie绕过验证码_Python Selenium Cookie 绕过验证码实现登录示例代码
  7. Servlet HTTP Status 405 - HTTP method GET is not supported by this URL
  8. structs2文件下载
  9. android表格布局的使用方法,Android布局(RelativeLayout、TableLayout等)使用方法
  10. Java实现string转byte