1,进程回收wait()
#include <unistd.h>
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\n”, 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 <unistd.h>
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);//如果当前子进程结束了,回收成功,返回子进程的进程号;如果当前子进程没结束,父进程也会立刻返回,返回值是0
waitpid(-1, &status, 0);//pid为-1,表示回收当前进程的任意一个子进程。此时等价于wait(&status);
waitpid(-1, &status, WNOHANG);//以非阻塞方式回收当前进程的任意一个子进程