(1)正常退出
(2)异常退出

检查wait和waitpid所返回的终止状态的宏

说明
WIFEXITED(status) 若为正常终止子进程返回的状态,则为真。对于这种情况可执行WEXITSTATUS(status),取子进程传送给exit、_exit或_Exit参数的低8位
WIFSIGNALED(status) 若为异常终止子进程返回的状态,则为真(接到一个不捕捉的信号)。对于这种情况,可执行WTERMSIG (status),取使子进程终止的信号编号。另外,有些实现(非Single UNIX Specification)定义宏WCOREDUMP (staus),若已产生终止进程的core文件,则它返回真
WIFSTOPPED(status) 若为当前暂停子进程的返回的状态,则为真。对于这种情况,可执行WSTOPSIG(status),取使子进程暂停的信号编号
WIFCONTINUED(status) 若在作业控制暂停后已经继续的子进程返回了状态,则为真。(POSIX.1的XSI扩展,仅用于waitpid.)

(3)父进程等待子进程退出

pid_t wait(int *status);
解析子进程返回的状态码
status是一个整形数指针
非空:子进程退出状态放在它所指向的地址中
空:  不关心退出状态

子进程状态不被收集会变成僵尸进程
僵尸进程:当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为一个僵尸进程。如果父进程先退出 ,子进程被init接管,子进程退出后init会回收其占用的相关资源。
        怎么查看僵尸进程:利用命令ps,可以看到有父进程ID为1的进程是孤儿进程;s(state)状态为Z的是僵尸进程。
        注意:孤儿进程(orphan process)是尚未终止但已停止(相当于前台挂起)的进程,但其父进程已经终止,由init收养;而僵尸进程则是已终止的进程,其父进程不一定终止。

status为NULL的代码示例

#include<stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
int main()
{pid_t pid;pid=fork();int cnt;if(pid>0){while(1){wait(NULL);printf("this is father print,pid=%d\n",getpid());sleep(1);printf("cnt=%d\n",cnt);}}else if(pid==0){while(1){printf("this is child print,pid=%d\n",getpid());sleep(1);cnt++;if(cnt==5){exit(-1);}}}return 0;
}

status不为空的代码示例

#include<stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
int main()
{pid_t pid;pid=fork();int status=10;int cnt;if(pid>0){while(1){wait(&status);printf("child quit,child status=%d\n",WEXITSTATUS(status));printf("this is father print,pid=%d\n",getpid());sleep(1);printf("cnt=%d\n",cnt);}}else if(pid==0){while(1){printf("this is child print,pid=%d\n",getpid());sleep(1);cnt++;if(cnt==5){exit(3);}}}return 0;
}

waitpid函数

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

对于waitpid函数中的pid参数的作用解释如下:
pid==-1 等待任意子进程,就这一方面而言,wait与waitpid等效。
pid>0 等待其进程ID与pid相等的子进程。
pid==0 等待其组ID等于调用进程组ID的任一子进程
pid<-1 等待其组ID等于pid绝对值的任一子进程
waitpid的options常量

常量 说明
WCONTINUED 若实现支持作业控制,那么由pid指定的任一子进程在暂停后已经继续,但其状态尚未报告,则返回其状态(POSIX.1的XSI扩展)。
WNOHANG(常用,不挂起,不堵塞) 如果pid指定的子进程没有结束,则waitpid()函数立即返回0,而不是阻塞在这个函数上等待;如果结束了,则返回该子进程的进程号。
WUNTRACED 若某实现支持作业控制,而由pid指定的任一子进程已处于暂停状态,并且其状态自暂停以来还未报告过,则返回其状态。WIFSTOPPED宏确定返回值是否对应于一个暂停子进程。如果子进程进入暂停状态,则马上返回。

如果不想使用这些选项,则可以把这个参数设为0。
如果像这样调用waitpid函数:waitpid(-1, status, 0),这此时waitpid()函数就完全退化成了wait()函数。
代码示例

#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
int main()
{pid_t pid;pid=fork();int status;int cnt;if(pid>0){while(1){waitpid(pid,&status,WNOHANG);printf("child quit,child status=%d\n",WEXITSTATUS(status));printf("this is father print,pid=%d\n",getpid());sleep(1);printf("cnt=%d\n",cnt);}}else if(pid==0){while(1){printf("this is child print,pid=%d\n",getpid());sleep(1);cnt++;if(cnt==5){exit(3);}}}return 0;
}

进程的退出方式以及僵尸进程和孤儿进程相关推荐

  1. linux基础知识——僵尸进城和孤儿进程

    1.什么是孤儿进程? \qquad父进程先于子进程结束,则子进程成为孤儿进程.父进程结束后,子进程的父进程由init进程接替. #include<stdio.h> #include< ...

  2. linux孤儿进程组深入理解,unix基础---有关于孤儿进程组和终端会话的理解-------值得一看!!!...

    转载自http://xingyunbaijunwei.blog.163.com/blog/static/765380672011112633634628/ 孤儿进程: 即一个其父进程已经终止的进程.  ...

  3. Linux系统编程11:进程入门之详细阐述进程的一些状态区分僵尸状态和孤儿状态动图演示

    文章目录 (1)几个重要的状态 A:R(running)-运行状态 B:S(sleeping)-睡眠状态 C:D(Disk sleep)-磁盘休眠状态 D:T(stopped)-停止 (2)进程状态路 ...

  4. linux查看节点使用进程后退出,Linux通过端口号查看使用进程-结束进程

    1. 查看进程(参数带 - 与不带有区别): command [options] 例:ps  -a(配合其他options参数以展示进程更多参数) ps -ef | grep 进程名(返回值是该进程的 ...

  5. linux 僵尸进程deffunc,多进程-开启子进程的两种方式,查看进程的pid与ppid,僵尸进程与孤儿进程...

    一.开启子进程的两种方式 方式一: # 方式一: from multiprocessing import Process import time def task(name): print(" ...

  6. java 僵尸进程_孤儿进程与僵尸进程

    开发中,在io密集型的场景下,我们可以使用多进程(多线程/协成更nber)来提高任务的处理速度.这就需要主进程需要等待所有工作进程执行完毕后才可以去汇总结果后退出. 但如果不规范的编写程序,就可能导致 ...

  7. Linux系统编程--3(exec 函数族,僵尸进程和孤儿进程,wait和wait_pid回收子进程)

    exec 函数族 fork 创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支) ,子进程往往要调用一种 exec 函数以执行另一个程序.当进程调用一种 exec 函数时,该进程的用户 ...

  8. vmware-vmx.exe无法结束进程_孤儿进程与僵尸进程产生原理分析,以及终极解决方案案例实现...

    开发中,在io密集型的场景下,我们可以使用多进程(多线程/协成更nber)来提高任务的处理速度.这就需要主进程需要等待所有工作进程执行完毕后才可以去汇总结果后退出. 但如果不规范的编写程序,就可能导致 ...

  9. Linux中进程的退出

    文章目录 目录 系列文章目录 文章目录 一.进程的退出方式 1.正常退出 2.异常退出 二.父进程等待子进程退出 1.明确创建子进程的目的 2.子进程的退出状态 (1)不被收集 (2)被收集 2.1代 ...

最新文章

  1. 我的随笔之三——今年过年快乐吗?
  2. JavaScript中hoisting(悬置/置顶解析/预解析) 实例解释,全局对象,隐含的全局概念...
  3. maven-source 1.3 中不支持注释请使用 -source 5 或更高版本以启用注释
  4. 【JavaSE_06】Java中的数组(array)-练习
  5. html5视频播放器脚本怎么用,HTML5 video标签(播放器)学习笔记(一):使用入门...
  6. 使用SQL脚本创建数据库,操作主键、外键与各种约束(MS SQL Server)
  7. 关系数据库SQL之可编程性函数(用户自定义函数)
  8. 微信 手机 网站 开发 签名 signature node (在更新中)
  9. Android 获取地理位置信息 封装好了 直接用
  10. 2018-2019-1 20189213《Linux内核原理与分析》第五周作业
  11. Linux一些有用的操作
  12. echarts 自定义鼠标悬停展示
  13. 微信公众号支付开发-php
  14. 华为OSN3500与路由器混合组网
  15. 计算机网络工程专业大学排名,2021网络工程专业大学排名 最好大学排行榜
  16. 解决Mybatis报错问题:Type interface com.tjcu.dao.UserDao is not known to the MapperRegistry.
  17. 三星j7出现android,三星J7配置曝光 配骁龙625/运行安卓7.0
  18. Spring Boot 从入门到精通(一)HelloWorld(构建项目,热部署,测试)
  19. java怎么写桌面日历_Win7桌面怎么添加日历记事本
  20. Miracast投屏反控

热门文章

  1. python界面编程和网口通信_Python—网络通信编程之tcp通信编程
  2. matlab连续卷积动画实现(gui编程)
  3. bean.xml配置数据源和读取配置文件配置数据源
  4. 【服务器】一次对Close_Wait 状态故障的排查经历
  5. 《Note --- Unreal 4 --- Sample analyze --- StrategyGame(continue...)》
  6. 数据帧,数据包,报文段,报文,分组,数据包的概念和区别
  7. Android动画及滑动事件冲突解决(转载)
  8. ASP.NET跨页传值方法汇总
  9. matlab画泡面图,MATLAB中,( )函数可以保存图像并指定为图像文件格式。
  10. 车载安卓中控改鸿蒙,教你改装车子中控安卓大屏,看一遍你就会了,改完后低配秒变高配...