进程等待
为什么要等待?
1.子进程退出,如果父进程不管不顾,可能造成僵尸问题,造成内存泄漏
2.一旦变成僵尸状态,kill -9都无能为力,因为没有谁可以杀死一个死去了的进程
3.父进程需要知道子进程完成任务的情况(对错与否,有没有异常退出等)
4.父进程需要通过进程等待的方式回收子进程的资源,获取退出信息
怎么等待?(两个接口函数)
wait系统调用
#include<sys/types.h> #include<sys/wait.h> pid_t wait(int* status)
参数:status输出型参数,整型指针,指向的空间存放的是子进程退出的状态,获取子进程状态,不关心可以设置为NULL
返回值:pid_t类型,如果返回值大于0,说明等待成功,返回的是子进程的ID,可以通过status查看子进程的退出状态;如果返回值等于-1,则说明等待失败(可能wait的进程本身没有子进程)
该方式为阻塞式等待,父进程什么都不做在等待子进程退出,如果没有子进程退出,父进程会一直等;如果父进程收到SIGCHLD信号,该函数就会立马返回立马清理。
–
waitpid系统调用
#include<sys/types.h> #include<sys/wait.h> pid_t waitpid(pid_t pid, int* status, int options)
参数:pid表示要等待的是哪个进程,status仍然是个输出型参数,存放子进程的退出码,options是一个选项,如果options设置为0,那么这个函数就是阻塞式等待,如果设置为WNOHANG,则函数为非阻塞式等待(发现已经没有退出的子进程可以收集)
返回值:返回值大于0,等待成功,返回子进程的id,返回值等于0,表示发现等待的子进程没有退出,返回值等于-1,调用失败
如果参数pid设置为-1,则表示等待任意子进程,和wait等效
–
wait和waitpid的区别?
wait是阻塞式等待,waitpid可自行选择(options为0阻塞,options为WNOHANG为非阻塞)
wait等待的是任意子进程(等到谁就是谁),waitpid等待的是参数pid传进来的确定子进程