嵌入式Linux并发程序设计,进程,进程回收wait()/waitpid(),系统宏定义中statu
2019-07-13 09:20发布
生成海报
文章目录
1,进程回收wait()
#include
pid_t wait(int *status);
- 成功时返回回收的子进程的进程号;失败时返回EOF
- 若子进程没有结束,父进程一直阻塞
- 若有多个子进程,哪个先结束就先回收(父进程回收多个子进程,就用多个wait()回收)
- status 指定保存子进程返回值和结束方式的地址(传值时,定义一个整形变量,传变量的地址。如果定义一个整形指针,直接传指针,那么传入的是一个空指针,不建议这么做)
- 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,进程返回值和结束方式
-
进程正常结束:通过exit(status) / _exit(status) / return status返回某个值(0-255即status的低八位可以被系统接收,其余的会被舍弃)
-
进程非正常结束:被信号结束
-
父进程调用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);
- 成功时返回回收的子进程的pid或0(返回值为0,表示当前要回收的子进程还没有结束);失败时返回EOF
- pid可用于指定回收哪个子进程或任意子进程
- status指定用于保存子进程返回值和结束方式的地址
- option指定回收方式,0(阻塞的方式,跟wait()一样) 或 WNOHANG(非阻塞,如果子进程没有结束,waitpid()会立马返回0)
进程回收waitpid()示例
waitpid(pid, &status, 0);
waitpid(pid, &status, WNOHANG);
waitpid(-1, &status, 0);
waitpid(-1, &status, WNOHANG);
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮