wait获取子进程退出状态 WIFEXITED和WIFSIGNALED用法可以使用 wait 函数传出参数 status 来保存进程的退出状态 常用宏函数分为日如下几组 nbsp 1 WIFEXITED status 若此值为非 0 表明进程正常结束 nbsp 若上宏为真 此时可通过 WEXITSTATUS status 获取进程退出状态 exit 时参数 nbsp 示例 if WIFEXITED status printf 退
可以使用wait函数传出参数status来保存进程的退出状态。
if(WIFEXITED(status)){ printf("退出值为 %d\n", WEXITSTATUS(status)); }
if(WIFSIGNALED(status)){ printf("使得进程终止的信号编号: %d\n",WTERMSIG(status)); }
WIFEXITED和WIFSIGNALED用法完整程序:
#include
#include
#include
#include
#include
int main(void) { pid_t pid, wpid; int status; pid = fork(); if(pid == 0){ printf("child --- my parent is %d\n", getppid()); sleep(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.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.out yu@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 -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
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/222639.html原文链接:https://javaforall.net