wait函数linux,Linux wait函数status的含义

一般来说我们使用wait函数进行主进程对于子进程的回收,以免子进程变成僵尸进程,使用方法很简单:

include

#include

#include

#include

int main()

{

pid_t pid=fork();

if(pid<0)

{

perror("fork");

exit(1);

}

if(pid==0)

{

printf("child is run,child pid is :%d\n",getpid());

sleep(5);

printf("child is run.\n");

exit(10);

}

if(pid>0)

{

int status=0;

pid_t ret=0;//记得需要声明ret

do

{

ret=waitpid(-1,&status,WNOHANG);//非阻塞式等待

if(ret==0)

{

printf("child is running,\n");

}

sleep(1);

}while(ret == 0);//ret!=0表示子进程结束

if(WIFEXITED(status)&&(ret==pid))

{

printf("wait child 5s success,child exit code is:%d\n",WEXITSTATUS(status));

}

else

{

printf("wait child failed.\n");

exit(1);

}

}

return 0;

}

可以利用宏 WIFEXITED 来取出子进程是否正常退出,为真则是正常退出,还可以利用 WEXITSTATUS 来取出子进程的退出码,status只用到低16位这个我是知道的,而且正常退出的情况下低7位表示是否正常退出,为0的话表示正常退出,高8位表示的是退出码的数字,所以上面的程序可以改写成如下:

if(((status&0x7f)==0) && ret==pid)

{

printf("child exit code:%d\n",(status>>8)&0xff);

}

我再把这两个宏贴出来,非常简单

#define WIFEXITED(status) (((status) & 0x7f) == 0)

#define WEXITSTATUS(status) (((status) & 0xff00) >> 8)

含义与我们理解的一样,但是我万万没想到的是这个只是程序正常退出情况下意义,如果程序运行状态不是正常退出,这16位的定义TM居然不是一个含义,例如被Kill,被Stoped,上图:

fa4982233a56

image.png

我们经常 wait(&status) 的用法只是对应上图的第一行,前8位表示exit stautus ,后7位(其实是后8位)表示的是0,参考上面的例子很好理解了,但是请看 Stopped 的情况,前8位表示的是Stop Signal,后7位(其实是后8位)居然是一个常数0X7F表示是Stopped的状态,遇到这种情况应该怎么用呢:

很简单先判断低7位是不是固定的数字0X7F,然后再取高8位的Stopped 信号,给大家看看Android 在一个版本 WIFSTOPPED 判断是否暂停状态的定义如下:

#define WTERMSIG(s) ((s) & 0x7f)

#define WSTOPSIG(s) WEXITSTATUS(s)

#define WIFEXITED(s) (WTERMSIG(s) == 0)

#define WIFSTOPPED(s) (WTERMSIG(s) == 0x7f)

WIFSTOPPED 也是判断后7位是否为常数0X7F···

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值