在UNP中讲到了,多进程模型.即如果服务器端fork一个新的进程去处理新来的连接.那么当连接断开时,父进程就需要回收子进程的资源,否则子进程退出后成为僵死进程,浪费系统资源.
因为子进程退出后会给父进程一个SIGCHLD信号,通常的做法时当父进程收到SIGCHLD信号后,使用wait函数回收子进程资源.但是存在一个问题,当多个子进程同时向父进程发送SIGCHLD时,由于信号不会排队,所以可能无法将所有的子进程都回收完.并且,如果没有子进程结束的话,调用wait函数是会阻塞的,所以我们采用了waitpid函数
pid_t waitpid(pid_t pid, int *status, int options);
pid时要处理的子进程的进程号,但是如果pid设置为-1时,可以回收所有的子进程,并且设置option为WNOHANG,就会在没有子进程退出时返回.
有了这个函数,我们在信号捕获函数中,循环的调用waitpid函数,当返回出错,说明子进程回收完成,就可以接着继续执行其他业务代码了.