》 一个进程的退出可能是正常退出也可能是异常退出,进程的PCB则会记录这些信息:如果是正常退出则记录退出转台,若为异常退出,则记录进程退出信号。父进程可以通过调用wait或者waitpid来获取这些信息。
那么父进程调用wait函数会发生什么状况呢?
1.如果其所有子进程还在运行,则导致阻塞
2.如果子进程已经终止,正在等待父进程获取退出状态,则可以获取进程退出信息并返回
3.若果没有子进程,则出错退出
所以wait函数就是,必须得子进程结束父进程才可以调用它,子进程就等着你来得到它的退出情况呢,如果子进程还没运行完,你就急着来wait,那么就会导致进程阻塞。
》 头文件:
#include<sys/types.h>
#include<sys/wait.h>
等待函数1. pid_t wait(int* status)成功返回子进程pid失败返回-1 status获取子进程的退出状态,不关心则只置为NULL
$如果进程由于接收到了SIGCHILD而调用wait函数,则可以期望wait会立即返回不会造成进程阻塞,否则,可能会造成调用进程阻塞
$若status不为空则子进程的退出状态存放在它所指定的单元内,否则置为NULL就好
等待函数2. pid_t waitpid(pid_t pid,int* status,int options)
返回值分析:
1.当正常返回时,waitpid会得到子进程的pid
2.若设置了选项WNOHANG(未阻塞),没有终止子进程可以收集则返回0
3、如果调用中出错则返回-1,并且erron会设置成相应的值来指示错误的位置
4.如果pid所指示的子进程不存在或者子进程不是调用进程的子进程,则waitpid出错返回,并且erron会置为ECHILD
pid:
pid=-1:等待进程的任一个子进程
pid>0:等待进程子进程ID等于pid的进程
pid==0:等待其组ID等于调用进程组ID的任一进程
pid<-1:等待其组ID等于pid绝对值的任一进程
status:
WIFEXITED(status):若返回正常终止子进程的状态则为真(查看子进程是否正常退出)
WEXITSTATUS:若WEXITSTATUS非零,则提取子进程的退出码
options:
WNOHANG :若pid指定的子进程没有结束,则waitpid()函数返回0,不予以等待。若正常结束,则返回该子进程的ID。(进程是否阻塞)
WIFEXITED(status) : 若为正常终止子进程返回的状态,则为真。
// 举例:1. 正常创建父子进程,子进程正常退出,父进程等待,并获取退出状态status。调用该宏,查看输出结果(正常为非0,或1)。2. 正常创建父子进程,子进程pause(),父进程等待,并设置获取退出状态status,kill杀掉子进程。调用该宏,查看输出结果(结果为0)。(进程等待状态是否正常)
WEXITSTATUS(status) : 若WIFEXITED非零,返回子进程退出码,提取进程退出返回值,如果子进程返回
exit(7),WEXITSTATUS(status)就会返回7.请注意,如果进程不是正常退出的,也就是说,WIFEXITED返回0,这个值就毫无意义。(获取进程退出码)