分类:
2011-12-30 22:48:21
在多进程的程序中,我们可以使用函数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的最低字节里。