Chinaunix首页 | 论坛 | 博客
  • 博客访问: 371158
  • 博文数量: 107
  • 博客积分: 927
  • 博客等级: 大尉
  • 技术积分: 865
  • 用 户 组: 普通用户
  • 注册时间: 2011-04-13 17:50
文章分类

全部博文(107)

文章存档

2014年(2)

2013年(13)

2012年(16)

2011年(76)

分类: 嵌入式

2011-12-29 16:33:20

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

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

-小Y头-2011-12-30 22:53:38

exit太强大的原因

十七岁的回忆2011-12-30 21:42:21

禁用宏之后会怎样呢?