作者:傲慢的心雅_243 | 来源:互联网 | 2023-10-11 19:44
一个进程在终止时会关闭所有文件描述符,释放在用户空间分配的内存,但它的PCB还保留着,内核在其中保存了一些信息:如果是正常终止则保存着退出状态,如果是异常终止则保存着导致该进程终止的信号是哪个。这个进程的父进程可以调用wait或waitpid函数获取这些信息,然后彻底清除掉这个进程
- 函数功能:父进程调用wait函数可以回收子进程终止信息。该函数有三个功能:
- 阻塞等待子进程退出
- 回收子进程残留资源
- 获取子进程结束状态(退出原因)。
wait一旦被调用,就会一直阻塞在这里,直到有一个子进程退出出现为止
进程等待的方法有wait方法和waitpid方法。
这里了解一下函数的使用,头文件包含以及函数原型,以及返回值等等。
wait函数
#include
#include
pid_t wait(int *status);
//该函数的参数为输出型参数,该参数可以获得被等待进程的退出状态信息,并把该信息带出
//返回值:失败返回-1,成功就返回被等待进程的pid.
这里大概解释一下输出型参数,函数的输入和输出是靠函数参数的 。如果这个参数是用来做输入的,就叫输入型参数 ,如果这个参数是用来做输的,就叫输出型参数 。
waitpid函数
#include
#include
pid_t waiitpid(pid_t pid,int *status,int options);
//该函数的参数:
//第一个参数pid:
//pid=-1,等待任意一个子进程,此时的作用相当于wait函数。
// pid>0,等待一个进程ID是pid的子进程。
//第二个参数status:
//WIFEXITED(status)(查看子进程是否正常退出),若为正常终止子进程退出的状态,则为真,否则为假
//WEIXTSTATUS(status)(获取进程的退出吗),在该进程正常终止(WIFEXITED(status)不为0)的情况下才有意义,提取子进程退出码。
//第三个参数options:
//WNOHANG:若pid对应的子进程没有结束,则返回0,若该子进程结束,则返回子进程的ID.
//返回值:-1 0 大于0
若waitpid等到了正常终止的子进程,则返回该子进程的ID(即为大于0 的情况);
若设置了WNOHANG的值,而等不到正常退出的子进程,即返回0;
若调用waitpid函数出错,则返回-1;
如果,在调用wait或waitpid的函数时,子进程已经退出了,函数会立即退出,并同时释放资源,获取该子进程的退出信息。若子进程存在且依旧在运行(未退出),则进程有可能阻塞。若不存在该子进程,则函数出错返回。
若有错误,欢迎指正 😃