Chinaunix首页 | 论坛 | 博客
  • 博客访问: 523901
  • 博文数量: 235
  • 博客积分: 1209
  • 博客等级: 少尉
  • 技术积分: 1417
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-19 19:59
文章分类

全部博文(235)

文章存档

2012年(107)

2011年(128)

分类:

2011-12-30 21:40:56

原文地址:浅谈进程退出状态 作者:zou_12345

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

阅读(812) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~