1.wait函数回收子进程

\qquad父进程可以调用wait()函数回收子进程的终止信息。wait函数有三个功能:
\qquad阻塞等待子进程退出
\qquad回收子进程残留资源
\qquad获取子进程结束状态(退出原因)

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include <sys/wait.h>
#include <sys/types.h>int main()
{pid_t pid,wpid;pid = fork();if(pid==0){printf("i am child,my id is %d,my parent id is %d\n",getpid(),getppid());sleep(5);printf("--------child die---------\n");}else if(pid>0){    wpid = wait(NULL);if(wpid==-1){perror("wait error");exit(1);}printf("i am parent,my id is %d,my son id is %d\n",getpid(),pid);}else{perror("fork error");exit(1);}return 0;
}

\qquad使用wait(&status)获取子进程结束的状态,然后把status传给宏函数来进一步判断进程终止的原因。
\qquadWIFEXITED(status)为非0,即为真,则进程正常结束,然后使用WEXITSTATUS(status),获取进程的退出状态,即exit函数的参数。

\qquadWIFSIGNALED(status)为非0,即为真,则进程异常终止,然后使用WTERMSIG(status),获取终止进程的那个信号的编号。
\qquad子进程的异常终止:

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include <sys/wait.h>
#include <sys/types.h>int main()
{pid_t pid,wpid;int status;pid = fork();if(pid==0){printf("i am child,my id is %d,my parent id is %d\n",getpid(),getppid());sleep(5);printf("--------child die---------\n");//exit(23);execl("/home/linux/2_孤儿进程/error","  ",NULL);}else if(pid>0){    wpid = wait(&status);if(wpid==-1){perror("wait error");exit(1);}else{if(WIFEXITED(status)){printf("子进程已经被回收,且正常结束,退出状态为%d\n",WEXITSTATUS(status));}if(WIFSIGNALED(status)){printf("子进程已经被回收,异常结束,终止子进程的信号为%d\n",WTERMSIG(status));}}printf("i am parent,my id is %d,my son id is %d\n",getpid(),pid);}else{perror("fork error");exit(1);}return 0;
}

\qquaderror的错误代码:

#include<stdio.h>
int main()
{int a =5;int b;b = a/0;printf("%d\n",b);return 0;
}

\qquad运行结果:

i am child,my id is 7244,my parent id is 7243
--------child die---------
子进程已经被回收,异常结束,终止子进程的信号为8
i am parent,my id is 7243,my son id is 7244

\qquad子进程的正常结束:

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include <sys/wait.h>
#include <sys/types.h>int main()
{pid_t pid,wpid;int status;pid = fork();if(pid==0){printf("i am child,my id is %d,my parent id is %d\n",getpid(),getppid());sleep(5);printf("--------child die---------\n");exit(23);//execl("/home/linux/2_孤儿进程/error","  ",NULL);}else if(pid>0){    wpid = wait(&status);if(wpid==-1){perror("wait error");exit(1);}else{if(WIFEXITED(status)){printf("子进程已经被回收,且正常结束,退出状态为%d\n",WEXITSTATUS(status));}if(WIFSIGNALED(status)){printf("子进程已经被回收,异常结束,终止子进程的信号为%d\n",WTERMSIG(status));}}printf("i am parent,my id is %d,my son id is %d\n",getpid(),pid);}else{perror("fork error");exit(1);}return 0;
}

\qquad程序运行结果:

i am child,my id is 8000,my parent id is 7999
--------child die---------
子进程已经被回收,且正常结束,退出状态为23
i am parent,my id is 7999,my son id is 8000

2.waitpid函数回收子进程

\qquadwaitpid函数有三个参数,第一个可以指定回收子进程的id,回收指定的子进程;第二个和wait函数一样,传入参数int &status,可以传出进程下一步的判断;第三个参数是int options,可以修改阻塞状态。

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

\qquad第一个参数pid:>0:指定子进程;-1:任意回收一个子进程;0:回收所有子进程;<-1:回收指定进程组内的任意子进程。
\qquad第三个参数options:当参数为WNOHANG时,为非阻塞状态;为0时,阻塞等待状态。

linux基础知识——wait函数和waitpid函数回收子进程相关推荐

  1. db2 replace函数的用法_SQL基础知识:常用字符处理函数

    原标题:SQL基础知识:常用字符处理函数 作者:丶平凡世界

  2. linux waitpid实例,【Linux】僵尸进程,孤儿进程以及wait函数,waitpid函数(有样例,分析很详细)...

    本文内容: 1.僵尸进程,孤儿进程的定义,区别,产生原因,处理方法 2.wait函数,waitpid函数的分析,以及比较 背景:由于子进程的结束和父进程的运行是一个异步的过程,即父进程永远无法预测子进 ...

  3. linux基础知识_压缩—进程管理-网络管理-ftp-nfs-ssh-scp

    linux基础知识_压缩-进程管理-网络管理-ftp-nfs-ssh-scp 1.压缩包管理 gzip .gz格式的压缩包,不打包,分别压缩,原文件消失 bzip2 .bz2格式的压缩包,原文件不会消 ...

  4. Linux基础知识--2.Linux的文件系统和bash的基础特性(1)

    Linux基础知识--linux的文件系统和bash的基础特性 一.Linux文件系统: Linux文件系统中的文件是数据的集合,文件系统不仅包含着文件中的数据而且还有文件系统的结构,所有Linux ...

  5. 【Linux系列】Linux基础知识整理

    Linux操作系统在服务器领域广泛的使用到,作为一个后台开发工程师很有必要了解Linux相关的知识. 本篇日志是我学习Linux过程中的简单记录和总结.本着"理论够用,实践为主"的 ...

  6. Linux基础知识梳理

    Linux基础知识梳理 Linux系统的学习的方法: 1. 做一个属于自己的笔记. 2. 学习方法:实验多敲几遍, 服务器硬件 一般的服务器 刀片服务器 Linux操作系统最初是在1991年10月份由 ...

  7. Linux基础知识与文件系统简介

    Linux基础知识与文件系统简介 参考文献:Ubuntu Linux 基础教程 Linux是在什么样的历史背景下出现的 Linux的诞生与发展与UNIX系统.Minix系统.Internet.GNU计 ...

  8. 总结Linux基础知识和常用渗透命令!!!

    作为Web渗透的初学者,Linux基础知识和常用命令是我们的必备技能,本文详细讲解了Linux相关知识点及Web渗透免了高龄.如果想玩好Kali或渗透,你需要学好Linux及相关命令,以及端口扫描.漏 ...

  9. Linux基础知识与命令

    目录 一.Shell 1.Shell定义 2.不同的Shell环境 二.Linux命令的分类 1.Shell与内部命令.外部命令 2.help命令可以查看内部命令 3.使用type命令来区分内外部命令 ...

  10. wait()函数和waitpid()函数详解

    文章目录 1. wait()函数 2. waitpid()函数 3. wait() 和 waitpid() 用法和比较 1. wait()函数 #include <sys/types.h> ...

最新文章

  1. oracle多种导入导出数据方法
  2. 清华张亚勤院士团队招聘 AI 工业方向博士后
  3. TCP/IP 网络数据封包和解包
  4. .net网络编程之一:Socket编程
  5. C指针-这该死的嵌入式学习生涯
  6. 每日一题(21)——malloc与free(二)
  7. 开发者请注意!2020年的大前端发展趋势已出炉! | 原力计划
  8. NYOJ463 - 九九乘法表
  9. ubantu的二三事
  10. 域名访问html乱码,显示地址和域名解析时出现乱码
  11. mysql正则防注入_防止sql注入的方法
  12. 前端学习(六)——HTML5中通过CSS设置超链接及鼠标形状
  13. 如何区分是前端BUG还是后端BUG
  14. 期货日内交易小经验-开仓篇
  15. 6月13日云栖精选夜读:数梦工场完成A轮7.5亿融资 三个维度构建“新型互联网”
  16. outlook配置阿里企业邮箱
  17. 发现ramnit样本一枚
  18. JAVA-stage3-day03-MybatisMybatisPlus
  19. MAGIC文件格式解析
  20. Ubuntu18.04更换下载源时卡在waiting for unattended-upgr to exit(更换下载源 正在等待unattended-upgr 退出)问题的解决办法

热门文章

  1. 剑指Offer - 面试题66. 构建乘积数组(正反遍历)
  2. LeetCode 162. 寻找峰值(二分查找)
  3. 小米2s自带rec刷root_刷Magisk模块开机卡Logo了怎么办?两种方法教你轻松解决
  4. 总结python换源的方法:Linux与windows系统
  5. python基本知识、数据库、网络、编程等总结
  6. Django视图(python函数)
  7. Javascript复习题
  8. python入门神图
  9. 数据库开发设计规范及表结构设计原则
  10. 2021届秋招算法岗真的要灰飞烟灭了吗?