900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > Linux进程控制:wait获取子进程退出状态 WIFEXITED和WIFSIGNALED用法

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

时间:2021-01-17 19:18:55

相关推荐

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

可以使用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 6408child is diechild exit with 0parent pid = 6408, sonpid = 6409parent pid = 6408, sonpid = 6409parent pid = 6408, sonpid = 6409parent 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.outyu 6437 0.0 0.0 4224 784 pts/18 S+ 21:58 0:00 ./getstatus.outyu 6438 0.0 0.0 4356 84 pts/18 S+ 21:58 0:00 ./getstatus.outyu 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 6437child killed by 15parent pid = 6437, sonpid = 6438parent pid = 6437, sonpid = 6438parent pid = 6437, sonpid = 6438parent 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) SIGUSR111) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+338) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+843) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+1348) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-1253) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-758) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-263) SIGRTMAX-1 64) SIGRTMAX

版权声明

原文链接:/y396397735/article/details/53769865

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。