Board logo

标题: 浅谈进程退出状态 [打印本页]

作者: yuyang911220    时间: 2017-5-10 10:27     标题: 浅谈进程退出状态

在多进程的程序中,我们可以使用函数wait或waitpid在父进程里接收子进程的退出状态,如下面的代码所示:
int status;
        ……
if (fork() = = 0)               // 子进程
         {
         ……
exit(0);
         }
         else
         {
                   wait(&status);               // 父进程
                   ……
}
整型变量status里保存的就是子进程退出时的状态。根据子进程结束的方式,其退出状态分为两种:一、正常退出 二、被信号结束。对于第一种情况,如果子进程的代码里显式调用了函数exit(n)/_exit(n)/return (n)时,status里就包含了值n;否则的话,status里包含的值就等于子进程执行的最后一条语句的返回值。
对于第二种情况,status里包含的值就等于中断该子进程的信号的编号即信号类型。
我们可以使用系统中定义的宏来判断并显示status的值,如下所示:
if( WIFEXITED(status) )
              printf(“exit normally! The return code is %d\n”, WEXITSTATUS(stat));
else if( WIFSIGNALED(status))
              printf(“exit abnormally! The signal code is %d\n”, WTERMSIG(stat));
相关宏的定义如下:
#define __WAIT_INT(status)               status
#define WIFEXITED(status)               __WIFEXITED(__WAIT_INT(status))
#define __WIFEXITED(status)               (__WTERMSIG(status) == 0)
#define __WTERMSIG(status)               ((status) & 0x7f)
#define WEXITSTATUS(status)               __WEXITSTATUS(__WAIT_INT(status))
#define __WEXITSTATUS(status)               (((status) & 0xff00) >> 8)
由此可见,当子进程正常结束时,返回值保存在status的倒数第二个字节里,此时最低字节里的值应为0; 当子进程被信号终止时,对应的信号的类型就保存在status的最低字节里。




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0