UNIX的进程终止状态小结
2014-05-11 20:04
411 查看
在UNIX中的进程退出状态有三种,分别是
normal termination:一般在调用exit,_exit后,或别的进程kill它出现
abnormal termination:调用abort,出错时强制退出时出现
stopped;在进程接受到STOP信号时退出
先来说如何捕捉子进程的退出状态
其中WIFEXITED宏用来判断进程是否正常退出,WEXITSTATUS用于获取退出代码编号
WIFSIGNALED宏用于判断进程是否异常退出,WTERMSIG获取进程终止的异常信号编号
WIFSTOPPED宏用于判断stopped状态,WSTOPSIG取得使进程处于STOPPED的信号编号
下面是用于遍历这三个状态的测试函数
32行调用了raise函数主动产生了一个SIGSTOP,是子进程停止,与父进程使用
34行的waitpid(pid,&status,WUNTRACED)WUNTRACED选项,是waitpid只返回处在停止状态并且没有被报告过的进程状态,WIFSTOPPED获取其状态
结果如下normal termination, exit status = 7
abnormal termination, signal number = 6 (core file generated)
child stoopped, signalnumber 19
normal termination:一般在调用exit,_exit后,或别的进程kill它出现
abnormal termination:调用abort,出错时强制退出时出现
stopped;在进程接受到STOP信号时退出
先来说如何捕捉子进程的退出状态
#include #include #include void pr_exit(int status) { if (WIFEXITED(status)) printf("normal termination, exit status = %d\n", WEXITSTATUS(status)); else if (WIFSIGNALED(status)) printf("abnormal termination, signal number = %d%s\n", WTERMSIG(status), #ifdef WCOREDUMP WCOREDUMP(status) ? " (core file generated)" : ""); #else ""); #endif else if (WIFSTOPPED(status)) printf("child stooped, signalnumder %d\n",WSTOPSIG(status)); }
其中WIFEXITED宏用来判断进程是否正常退出,WEXITSTATUS用于获取退出代码编号
WIFSIGNALED宏用于判断进程是否异常退出,WTERMSIG获取进程终止的异常信号编号
WIFSTOPPED宏用于判断stopped状态,WSTOPSIG取得使进程处于STOPPED的信号编号
下面是用于遍历这三个状态的测试函数
#include #include #include #include #include #include void pr_exit(int status); //上一段代码的函数 int main() { pid_t pid; int s=0; int status; if ((pid=fork())<0) printf("fork error: %s", strerror(errno)); //出错处理 else if (pid==0) exit(7); //正常退出 if (wait(&status)!=pid) printf("wait error: %s", strerror(errno)); pr_exit(status); if ((pid=fork())<0) printf("fork error: %s", strerror(errno)); else if (pid==0) abort(); //异常退出 if (wait(&status)!=pid) printf("wait error: %s", strerror(errno)); pr_exit(status); if ((pid=fork())<0) printf("fork error: %s\n", strerror(errno)); else if (pid==0){ raise(SIGSTOP); //stopped停止 } if (waitpid(pid,&status,WUNTRACED)!=pid) printf("wait error: %s\n", strerror(errno)); pr_exit(status); exit(0); }
32行调用了raise函数主动产生了一个SIGSTOP,是子进程停止,与父进程使用
kill(pid,SIGSTOP);的效果相同
34行的waitpid(pid,&status,WUNTRACED)WUNTRACED选项,是waitpid只返回处在停止状态并且没有被报告过的进程状态,WIFSTOPPED获取其状态
结果如下normal termination, exit status = 7
abnormal termination, signal number = 6 (core file generated)
child stoopped, signalnumber 19
相关文章推荐
- UNIX环境编程学习笔记(21)——进程管理之获取进程终止状态的 wait 和 waitpid 函数
- UNIX环境编程学习笔记(21)——进程管理之获取进程终止状态的 wait 和 waitpid 函数
- 如何获取进程的终止状态
- UNIX环境编程学习笔记(15)——进程管理之进程终止
- Linux x86内核终止D状态的进程
- Unix kill 终止进程
- UNIX进程终止
- (三)和菜鸟一起学习unix 进程终止
- Linux x86_64内核终止D状态的进程
- 进程fork()两次---解决一个进程不必等待子进程终止,也不希望子进程处于僵死状态(一般是服务器进程fork())
- Linux如何终止D状态的进程
- Linux 多线程环境下 进程线程终止函数小结(转)
- Linux 多线程环境下 进程线程终止函数小结
- UNIX环境编程学习笔记(15)——进程管理之进程终止
- linux进程状态小结
- 【Unix/Linux】【命令】【进程】终止进程 —— kill,killall命令
- Linux 多线程环境下 进程线程终止函数小结
- Linux 多线程环境下 进程线程终止函数小结
- UNIX环境高级编程学习之第八章进程控制-用父子进程实现打开kate,返回kate关闭状态
- unix进程状态转换