一、僵死进程:子进程先于父进程执行完毕后,因为子进程的退出码需要保存起来供父进程随后调用wait使用,但子进程的数据结构等占用资源不会立刻被删除, 这就是僵死进程。
二、子进程退出的异步善后处理
(1)了避免僵死进程长期占用资源,父进程可以调用wait 或者waitpid暂时停止执行,等待子进程终止运行后,在继续执行父进程。
(2)wait函数说明:
#include<sys/types.h>
#include<sys/wait.h>
pid_t wait(int *stat_loc);
返回值:已经结束的子进程Id代表成功,-1代表失败。(提问,如果很多子进程,返回值子进程id,如何确定哪个子进程出现问题?)
当父进程调用wait后将被阻塞,直至任何一个子进程退出。可以通过WEXITSTATUS宏获得wait的参数stat_loc指向的返回码。(提问:如何获得?相关代码?)
(3)waitpid函数调用
#include<sys/types.h>
#include<sys/wait.h>
pid_t waitpid(pid_t pid, int *stat_loc,int options);
参数说明:pid代表父进程希望等待的某个子进程。如果为-1,则代表返回任何一个子进程的信息。
*stat_loc 代表退出码
options参数允许修改waitpid的行为,WNOHANG选项表示调用该函数的进程不会挂起,而且继续运行。
(4)异步善后处理
LINUX机制提供信号来实现进程间通,当进程收到SIGCHLD信号,于是父进程可以在处理程序中进行子进程退出后的处理。
void sigchld_handler(int signo);
{
......
do
{pid =waitpid(-1,&status,WNOHANG);
}while(pid>0);
}
通过执行waitpid循环,使用WNOHANG选项,当pid<=0时,表示无进程 退出,于是信号处理结束,返回父进程被信号中断的位置处继续处理。