一、现象:无法使用 kill -9 20592 , 杀死该子进程
二、原因:
父进程在fork产生子进程后,如果子进程死了,父进程没有进行回收,就会产生僵尸进程。
三、解决办法:
1、结束父进程,由父进程产生的僵尸进程也会回收处理
2、捕获子进程结束发给父进程的SIGCHLD信号,收到信号后执行waitpid函数进行回收处理
pid_t waitpid(pid_t pid, int *status, int options);
a、pid的参数说明:
pid<-1等待进程组号为pid绝对值的任何子进程。
pid=-1 等待任何子进程,此时的waitpid()函数就退化成了普通的wait()函数。
pid=0 等待进程组号与目前进程相同的任何子进程,也就是说任何和调用waitpid()函数的进程在同一个进程组的进程。
pid>0 等待进程号为pid的子进程。
b、status参数说明:
不关心子进程结束状态,直接传入NULL;
WIFEXITED(status)如果子进程正常结束,它就返回真;否则返回假。
WEXITSTATUS(status) 如果WIFEXITED(status)为真,则可以用该宏取得子进程exit()返回的结束代码。
WIFSIGNALED(status) 如果子进程因为一个未捕获的信号而终止,它就返回真;否则返回假。
WTERMSIG(status) 如果WIFSIGNALED(status)为真,则可以用该宏获得导致子进程终止的信号代码。
WIFSTOPPED(status) 如果当前子进程被暂停了,则返回真;否则返回假。
WSTOPSIG(status) 如果WIFSTOPPED(status)为真,则可以使用该宏获得导致子进程暂停的信号代码。
c、options:
不使用该参数功能, 传入0;
WNOHANG如果pid指定的子进程没有结束,则waitpid()函数立即返回0,而不是阻塞在这个函数上等待;
如果结束了,则返回该子进程的进程号。
WUNTRACED 如果子进程进入暂停状态,则马上返回