美文网首页
Linux wait函数status的含义

Linux wait函数status的含义

作者: 耗子_wo | 来源:发表于2020-03-24 11:55 被阅读0次

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

include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/wait.h>
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,上图:

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···

相关文章

  • Linux wait函数status的含义

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

  • OS Experiment-02

    常用进程函数 wait函数のstatus参数 signal函数的信号句柄有三种类型:忽略(SIG_IGN)默认的针...

  • wait()函数

    Linux wait()函数 - 成长中的鱼的日志 - 网易博客

  • Linux服务器CLOSE_WAIT连接过多

    Linux服务器CLOSE_WAIT连接过多 如果在Linux系统中执行以下命令,发现处于CLOSE_WAIT状态...

  • fork 子进程

    Fork, exec, wait and exit system call explained in Linux[...

  • Generator 函数的含义与用法

    Generator函数的含义与用法 Thunk函数的含义与用法 co函数库的含义与用法 async函数的含义与用法...

  • wait和waitpid函数

    wait()函数原型 函数wait和waitpid均返回两个值,已终止子进程的进程ID号,以及通过statloc指...

  • 进程控制(二)

    2016-02-03 wait3和wait4函数 pid_t wait3(int *statloc, int op...

  • Wait_Queue------在等待队列上睡眠

    sleep_on()函数 该函数的作用是定义一个等待队列(wait),并将当前进程添加到等待队列中(wait),然...

  • wait notify用法

    如何使用wait 在synchronized的函数或对象里使用wait、notify和notifyAll,不然Ja...

网友评论

      本文标题:Linux wait函数status的含义

      本文链接:https://www.haomeiwen.com/subject/enqoyhtx.html