wait获取子进程退出状态 WIFEXITED和WIFSIGNALED用法
2018-02-01 12:19
411 查看
可以使用wait函数传出参数status来保存进程的退出状态。
常用宏函数分为日如下几组:
1、 WIFEXITED(status) 若此值为非0 表明进程正常结束。
若上宏为真,此时可通过WEXITSTATUS(status)获取进程退出状态(exit时参数)
示例:
2
3
2、 WIFSIGNALED(status)为非0 表明进程异常终止。
若上宏为真,此时可通过WTERMSIG(status)获取使得进程退出的信号编号
用法示例:
2
3
3、 WIFSTOPPED(status)为非0 表明进程处于暂停状态
若上宏为真,此时可通过WSTOPSIG(status)获取使得进程暂停的信号编号
4、 WIFCONTINUED(status) 非0表示暂停后已经继续运行。
WIFEXITED和WIFSIGNALED用法完整程序:
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
测试程序
编译程序:
1、首先测试WIFEXITED正常退出情况,执行:
2
3
4
5
6
7
8
9
2、测试WIFSIGNALED信号终止,执行(sleep(300)便于测试):
2
此时另开一终端,查看进程,kill命令终止子进程:
2
3
4
5
6
此时子进程异常终止,getstatus.out 程序输出信息:
2
3
4
5
6
7
8
如上所知,使得进程终止的信号编号为15,通过 kill –l可知15号信号为SIGTERM:
常用宏函数分为日如下几组:
1、 WIFEXITED(status) 若此值为非0 表明进程正常结束。
若上宏为真,此时可通过WEXITSTATUS(status)获取进程退出状态(exit时参数)
示例:
if(WIFEXITED(status)){ printf("退出值为 %d\n", WEXITSTATUS(status)); }1
2
3
2、 WIFSIGNALED(status)为非0 表明进程异常终止。
若上宏为真,此时可通过WTERMSIG(status)获取使得进程退出的信号编号
用法示例:
if(WIFSIGNALED(status)){ printf("使得进程终止的信号编号: %d\n",WTERMSIG(status)); }1
2
3
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; }1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
测试程序
编译程序:
yu@ubuntu:~/cplusplus/wait进程控制$ gcc getstatus.c -o getstatus.out1
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 ....1
2
3
4
5
6
7
8
9
2、测试WIFSIGNALED信号终止,执行(sleep(300)便于测试):
yu@ubuntu:~/cplusplus/wait进程控制$ ./getstatus.out child --- my parent is 64181
2
此时另开一终端,查看进程,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.out yu@ubuntu:~/cplusplus/Process$ kill 64381
2
3
4
5
6
此时子进程异常终止,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 ...1
2
3
4
5
6
7
8
如上所知,使得进程终止的信号编号为15,通过 kill –l可知15号信号为SIGTERM:
yu@ubuntu:~/cplusplus/wait进程控制$ kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) 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用法
- 获取子进程终止状态:wait和waitpid
- 父进程获取子进程退出状态(1)
- 父进程获取子进程退出状态(2)
- shell同时启多个进程,并等待所有子进程结束,再做接下来的操作,最好能获取每个子进程的退出状态
- wait()函数,自杀函数abort(),WIFEXITED WIFSIGNALED
- Linux 父进程如何获取子进程返回值?parent get child process return value,fork,wait,wait_pid
- linux下的wait()实现等待一个子进程和所有子进程退出
- curl用法:获取网站的header头及状态码
- 【Win32多线程】创建线程、获取线程执行状态、退出线程、错误处理
- UNIX环境编程学习笔记(21)——进程管理之获取进程终止状态的 wait 和 waitpid 函数
- Wait4 & Ptrace & 进程调试 & 子进程状态获取 笔记总结
- Linux并发(子进程退出状态的处理)
- UNIX环境编程学习笔记(21)——进程管理之获取进程终止状态的 wait 和 waitpid 函数
- NetWork获取连接状态/WebView的简单用法/当按返回键时返回堆栈内容
- C++ wait捕捉的信号处理WIFEXITED/WEXITSTATUS/WIFSIGNALED
- newlisp获取bash命令的退出状态
- WIFEXITED WIFSTOPPED WIFSIGNALED用法
- 小程序web-view用wx.getNetworkType获取用户网络状态——微信web-view高级用法7
- linux c 唤醒进程 获取子进程结束状态