最近在开发Linux的程序是常常遇到僵死的进程,可是不知道怎么回事,也不知道原因。
所谓僵死进程就是没有父进程的子进程。问问很有经验的同事,也就知道怎么回事了。
解决的办法有二:
方法一:fork()两次,让子进程exit,孙子进程变为init的子进程。应为init在一个Linux系统中绝对存在。
static int start_deamon(void)
{
int status;
pid_t child_pid;
if((child_pid=fork())<0)
{
return -1;
}
else if(child_pid==0)
{
struct timeval tv;
tv.tv_sec = 0;
tv.tv_usec = 200;
(void)select(0, NULL, NULL, NULL, &tv);
char * argv[]={ "telnetd",(char *)NULL };
pid_t pid;
_eval (argv, NULL, 0, &pid);
exit(0);
}
waitpid( child_pid, &status, 0 );
return 0;
}
方法二:用signal的方式,子进程向父进程发送SIGCHLD。
signal (SIGCHLD, &SigChildHandler);
static void SigChildHandler (int sigNo)
{
/* * Oops, somebody we launched was killed.
* But first, we have to find out what PID died.
*/
printf("receive child signal:%d.",sigNo);
int status=0 ; pid_t pid;
while ((pid = waitpid(-1, &status, WNOHANG)) > 0)
{
printf("pid=%u has die",pid); //process pid die
}
}
哈哈,谢谢我的同事。
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/wait.h>
void wait4children(int signo) {
int status;
while(waitpid(-1, &status, WNOHANG) > 0);
}
int main() {
int i;
pid_t pid;
signal(SIGCHLD, wait4children);
for(i=0; i<100; i++) {
pid = fork();
if(pid == 0)
break;
}
if(pid>0) {
printf("press Enter to exit...");
getchar();
}
return 0;
}