可以使用wait函数传出参数status来保存进程的退出状态


常用宏函数分为日如下几组:
1、 WIFEXITED(status) 若此值为非0 表明进程正常结束。
若上宏为真,此时可通过WEXITSTATUS(status)获取进程退出状态(exit时参数)
示例:

        if(WIFEXITED(status)){printf("退出值为 %d\n", WEXITSTATUS(status));}

2、 WIFSIGNALED(status)为非0 表明进程异常终止。
若上宏为真,此时可通过WTERMSIG(status)获取使得进程退出的信号编号
用法示例:

    if(WIFSIGNALED(status)){printf("使得进程终止的信号编号: %d\n",WTERMSIG(status));   }

3、 WIFSTOPPED(status)为非0 表明进程处于暂停状态
若上宏为真,此时可通过WSTOPSIG(status)获取使得进程暂停的信号编号
4、 WIFCONTINUED(status) 非0表示暂停后已经继续运行。


WIFEXITED和WIFSIGNALED用法完整程序:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>int main(void)
{pid_t pid, wpid;int status;pid = fork();if(pid == 0){               //子进程printf("child --- my parent is %d\n", getppid());sleep(30);              //子进程睡眠30秒printf("child is die\n");}else if(pid>0){           //父进程wpid = wait(&status);   //等待回收子进程if(wpid == -1){perror("wait error:");exit(1);}//正常退出判断if(WIFEXITED(status)){printf("child exit with %d\n", WEXITSTATUS(status));}//因为某种信号中断获取状态if(WIFSIGNALED(status)){printf("child killed by %d\n", WTERMSIG(status));}while(1){printf("parent pid = %d, sonpid = %d\n", getpid(), pid);sleep(1);}} else {perror("for error");exit(1);}return 0;
}

测试程序
编译程序:

yu@ubuntu:~/cplusplus/wait进程控制$ gcc getstatus.c -o getstatus.out

1、首先测试WIFEXITED正常退出情况,执行:

yu@ubuntu:~/cplusplus/wait进程控制$ ./getstatus.out
child --- my parent is 6408
child is die
child exit with 0
parent pid = 6408, sonpid = 6409
parent pid = 6408, sonpid = 6409
parent pid = 6408, sonpid = 6409
parent pid = 6408, sonpid = 6409
....

2、测试WIFSIGNALED信号终止,执行(sleep(300)便于测试):

yu@ubuntu:~/cplusplus/wait进程控制$ ./getstatus.out
child --- my parent is 6418

此时另开一终端,查看进程,kill命令终止子进程:

yu@ubuntu:~/cplusplus/Process$ ps aux | grep getstatus.out
yu         6437  0.0  0.0   4224   784 pts/18   S+   21:58   0:00 ./getstatus.out
yu         6438  0.0  0.0   4356    84 pts/18   S+   21:58   0:00 ./getstatus.out
yu         6442  0.0  0.0  21292   976 pts/4    S+   21:58   0:00 grep --color=auto getstatus.outyu@ubuntu:~/cplusplus/Process$ kill 6438

此时子进程异常终止,getstatus.out 程序输出信息:

yu@ubuntu:~/cplusplus/wait进程控制$ ./getstatus.out
child --- my parent is 6437
child killed by 15
parent pid = 6437, sonpid = 6438
parent pid = 6437, sonpid = 6438
parent pid = 6437, sonpid = 6438
parent pid = 6437, sonpid = 6438
...

如上所知,使得进程终止的信号编号为15,通过 kill –l可知15号信号为SIGTERM:

yu@ubuntu:~/cplusplus/wait进程控制$ kill -l1) SIGHUP   2) SIGINT   3) SIGQUIT  4) SIGILL   5) SIGTRAP6) SIGABRT  7) SIGBUS   8) SIGFPE   9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT   17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG  24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM   27) SIGPROF 28) SIGWINCH    29) SIGIO   30) SIGPWR
31) SIGSYS  34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3
38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7
58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX    

wait获取子进程退出状态 WIFEXITED和WIFSIGNALED用法相关推荐

  1. Linux进程控制:wait获取子进程退出状态 WIFEXITED和WIFSIGNALED用法

    可以使用wait函数传出参数status来保存进程的退出状态. 常用宏函数分为日如下几组: 1. WIFEXITED(status) 若此值为非0 表明进程正常结束. 若上宏为真,此时可通过WEXIT ...

  2. 使用wait函数获取子进程终止状态

    1 wait/waitpid介绍 当一个进程正常或异常终止时,内核会向其父进程发送SIGCHLD信号.因为子进程终止是异步的,所以信号发送也是异步的.父进程可以选择忽略该信号,或者提供信号处理函数进行 ...

  3. Linux进程3:父进程等待(wait,waitpid)子进程退出并收集子进程退出状态,僵尸进程

    父进程等待(wait,waitpid)子进程退出并收集子进程退出状态 1.父进程为什么要等待子进程退出? 创建子进程目的:------干活 我们要知道干活结束没. 子进程退出状态不被收集,变成僵尸进程 ...

  4. 获取子进程终止状态:wait和waitpid

    当父进程调用wait和waitpid函数来获取子进程终止状态时,一般会有以下3种情况: 1.如果其所有子进程都还在运行,则阻塞: 2.如果一个子进程已终止,正等待父进程获取其终止状态,则取得该子进程的 ...

  5. WIFEXITED WIFSTOPPED WIFSIGNALED用法

    waitpid()介绍]waitpid主要用于根据进程ID号等待指定的子进程.函数形式如下:****************************************************** ...

  6. Shell程序退出状态码的命令详解

    在本篇文章当中主要给大家介绍了一些常见的程序退出的状态码!并且给出一下例子帮助大家仔细理解,并且使用C语言和python语言实现获取子进程退出时候的退出状态码. 程序退出状态码 前言 在本篇文章当中主 ...

  7. Linux系统编程之进程退出,父进程等待子进程退出

    1.首先讲一下进程的退出 进程的退出分为正常退出和异常退出: 正常退出: (1)main函数调用return (2)进程调用exit(),标准C库 (3)进程调用_exit()或_Exit(),属于系 ...

  8. linux获取命令的返回值,Shell $?:获取函数返回值或者上一个命令的退出状态

    $?是一个特殊变量,用来获取上一个命令的退出状态,或者上一个函数的返回值. 所谓退出状态,就是上一个命令执行后的返回结果.退出状态是一个数字,一般情况下,大部分命令执行成功会返回0,失败返回1,这和C ...

  9. linux里返回状态命令行,Shell $?获取函数返回值或者上一个命令的退出状态

    $? 是一个特殊变量,用来获取上一个命令的退出状态,或者上一个函数的返回值. 所谓退出状态,就是上一个命令执行后的返回结果.退出状态是一个数字,一般情况下,大部分命令执行成功会返回 0,失败返回 1, ...

最新文章

  1. 淘宝服务端并发分布式架构演进之路
  2. 得到相对Plugin的路径
  3. 零代码入门GitHub,图形化交互让你轻松存代码 | 附Git GUI推荐
  4. 利用cheat engine以及VC编写游戏修改器
  5. Java接口存在的意义以及如何解决菱形继承问题
  6. OpenCover+ReportGenerator实现.net代码覆盖率测试
  7. Linux常用命令—权限管理命令—其他权限管理命令
  8. 【动态规划】P1220:区间dp:关路灯
  9. 从Slice_Header学习H.264(二)--片头的子语法项目
  10. 数据库—事务—并发控制技术
  11. asp木马伪装成图片或其它,上传漏洞终极解决方法
  12. Matlab画图常用的指令是啥,matlab画图常用命令
  13. 全网最全 ECMAScript 攻略
  14. screen.colorDepth(色彩深度) 和 screen.pixelDepth(像素深度)
  15. 鸿蒙系统安全模式,菜鸟必看 如何在安全模式下使用光驱
  16. Google Earth Engine(GEE)——python法国里昂地区的地表温度和地面高程的静态制图
  17. datav多组件交互
  18. 智能机器人用什么语言编程
  19. 适用于***测试不同阶段的工具收集整理
  20. 从 Git 提交中删除文件

热门文章

  1. 求数组的平均数,中位数,众数
  2. Flex minWidth minHeight
  3. coreldraw选中对象无法移动解决方法
  4. [原创]详细的C++连接数据库
  5. openstack-nova源码分析(五)flavor extra_specs 扩展属性
  6. Java进阶知识笔记14--【junit、反射、注解】
  7. 什么是工控主机?工控主机安卓主板有哪些配置?
  8. 垂直同步(VSYNC)实现原理
  9. JAVA运算符与循环结构
  10. 自动色阶算法C语言,Photoshop图像处理算法—自动对比度跟自动色调(自动色阶)...