嵌入式Linux并发程序设计,进程,进程回收wait()/waitpid(),系统宏定义中statu

2019-07-13 09:20发布

文章目录

1,进程回收wait()

#include
pid_t wait(int *status);
  1. 成功时返回回收的子进程的进程号;失败时返回EOF
  2. 若子进程没有结束,父进程一直阻塞
  3. 若有多个子进程,哪个先结束就先回收(父进程回收多个子进程,就用多个wait()回收)
  4. status 指定保存子进程返回值和结束方式的地址(传值时,定义一个整形变量,传变量的地址。如果定义一个整形指针,直接传指针,那么传入的是一个空指针,不建议这么做)
  5. status为NULL表示直接释放子进程PCB,不接收返回值

进程回收wait()示例

int status; pid_t pid; if ((pid = fork()) < 0) { perror(“fork”); exit(-1); } else if (pid == 0) { sleep(1); exit(2); } else { wait(&status); printf(%x ”, status); }

2,进程返回值和结束方式

  1. 进程正常结束:通过exit(status) / _exit(status) / return status返回某个值(0-255即status的低八位可以被系统接收,其余的会被舍弃)
  2. 进程非正常结束:被信号结束
  3. 父进程调用wait(&status) 回收(系统中定义好了几个宏)
    · WIFEXITED(status)判断子进程是否正常结束(正常结束则返回逻辑真,否则返回逻辑假) · WEXITSTATUS(status)如果子进程是正常结束,获取子进程返回值(即通过exit/_exit/return返回的值) · WIFSIGNALED(status)判断子进程是否被信号结束(即判断子进程是否非正常结束) ·WTERMSIG(status)如果子进程非正常结束,获取结束子进程的信号类型

系统宏定义中status的含义

status 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 含义 高8位存放:exit/_exit/return返回的值 子进程的结束方式 低7位等于零,子进程是正常结束的 低7位大于零,子进程是非正常结束的
且低7位的值就是结束子进程的信号的类型

3,进程回收waitpid()

#include
pid_t waitpid(pid_t pid, int *status, int option);
  1. 成功时返回回收的子进程的pid或0(返回值为0,表示当前要回收的子进程还没有结束);失败时返回EOF
  2. pid可用于指定回收哪个子进程或任意子进程
  3. status指定用于保存子进程返回值和结束方式的地址
  4. option指定回收方式,0(阻塞的方式,跟wait()一样) 或 WNOHANG(非阻塞,如果子进程没有结束,waitpid()会立马返回0)

进程回收waitpid()示例

waitpid(pid, &status, 0);//如果该子进程没有结束,父进程就一直阻塞 waitpid(pid, &status, WNOHANG);//如果当前子进程结束了,回收成功,返回子进程的进程号;如果当前子进程没结束,父进程也会立刻返回,返回值是0 waitpid(-1, &status, 0);//pid为-1,表示回收当前进程的任意一个子进程。此时等价于wait(&status); waitpid(-1, &status, WNOHANG);//以非阻塞方式回收当前进程的任意一个子进程