原创 浅谈进程退出状态

2009-1-12 15:05 1517 5 5 分类: MCU/ 嵌入式

作者:曾宏安,华清远见嵌入式培训中心高级讲师。


在多进程的程序中,我们可以使用函数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的最低字节里。

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
5
关闭 站长推荐上一条 /3 下一条