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. mysql基础 事务的认识和使用
  2. POJ 3436 ACM Computer Factory(最大流+路径输出)
  3. 影响程序员薪资的,从来不止是学历!
  4. Python中的魔法属性
  5. 《C++ Primer 5th》笔记(9 / 19):顺序容器
  6. MYSQL避免全表扫描__如何查看sql查询是否用到索引(mysql)
  7. 使用Android手机进行开发的尝试
  8. MAX_VALUE的最大值和最小值是多少
  9. 数据结构与算法(二):线性表、栈、树(二叉树,AVL树)、图
  10. js定位div坐标存入mysql_用JS将页面定位到某个位置(DIV)
  11. 360驱动器显示服务器失败,360驱动大师显示驱动安装失败该怎么办 - 卡饭网
  12. 网页加速系列(六)、 网页加速之进阶下篇
  13. 如何逼自己玩命学习,这几款超奶思的学习APP,让你爱上学习!
  14. u盘启动 联想一体机_Lenovo消费台式机与一体机预装Windows 8改装Windows 7的解决方案...
  15. C语言链表的删除代码实现
  16. 如何让win7在桌面显示ie图标
  17. JK latch JK触发器 【数字电路】
  18. 微信小程序 17 个人中心和登录 的跳转
  19. TCP协议的相关特性
  20. 多种开关电源MOS管驱动电路详细解析

热门文章

  1. 上下伸缩代码_CQRS之旅——旅程4(扩展和增强订单和注册限界上下文)
  2. 线程间通信的几种方法_并发编程中的线程间通信
  3. oracle 02085,OracleDBLink创建和维护以及ORA-02085解决办法
  4. python怎么给画布填上颜色_python numpy matplotlib画小方块填充背景色和添加不同色彩的文字...
  5. 数据结构顺序表基本流程
  6. keil stm32标准库放在哪里_STM32之PWM
  7. python地理_【Python教程】地理可视化
  8. 百度AI技术盛宴来了!大咖齐聚解读CV/NLP/跨模态大模型技术!
  9. 深入理解 Objective-C:方法缓存
  10. 深度剖析RPC框架的核心设计