您的位置:首页 > 其它

UNIX的进程终止状态小结

2014-05-11 20:04 411 查看
在UNIX中的进程退出状态有三种,分别是
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 exit 退出状态