前言:wait() 和 waitpid() 函数在C语言中有释放子进程遗留资源的作用。当一个子进程结束时调用exit()或_exit(),会进入僵死状态,它的资源(如内存、打开的文件描述符等)并不会立即被系统回收。这些资源会保留,直到父进程调用 wait() 或 waitpid() 来收集子进程的状态信息。在父进程中调用wait()和waitpid(),会等待子进程结束,期间父进程会进入阻塞状态,直到接收到子进程结束的信号,才会继续执行。如果有多个子进程,那使用一个wait(NULL),父进程只会等待其中的一个。可以多次调用来等待所有的子进程都就结束。
一、wait()
函数头文件 #include <sys/types.h>
#include <sys/wait.h>
函数原型 : pid_t wait(int *wstatus);
函数功能 : 让函数调用者进程进入到睡眠状态,等待子进程进入僵死状态后,释放相关资源并返回
函数参数: wstatus:保存子进程退出状态值变量的指针(*****获取具体值需要使用宏定义*****)
函数返回值 wait(): 如果成功,返回终止子进程的进程ID;如果出错,则返回-1
实际上是有4种返回值,还有返回0和返回<-1,但这些都代表特定的情况,并不常见。
对于传入的参数wstatus,一些宏可以对参数进行操作:
- WEXITSTATUS(status): 如果子进程是正常退出的,这个宏可以用来获取子进程的退出状态码。
- WTERMSIG(status): 如果子进程是因为信号而终止的,这个宏可以用来获取导致子进程终止的信号。
- WSTOPSIG(status): 如果子进程是被停止的,这个宏可以用来获取导致子进程停止的信号。
- WIFEXITED(status): 检查子进程是否正常退出。如果返回非零值,表示子进程是正常退出的。
- WIFSI