日期:2014-05-16  浏览次数:20845 次

请教关于 linux pppoe产生僵尸进程的问题
目前项目中应用程序会定时尝试连接pppoe,现在存在一个问题就是如果pppoe账号错误的话,每次连完都会有一个僵尸进程产生,对系统资源造成很大影响  

784 root Z [pppd]

连接的时候应用程序会发送给一个后台程序,然后由后台程序执行system命令如下

system("/bin/pppd pty \'/bin/pppoe -I eth0 -T 80 -U -m 1412\' user username usepeerdns noipdefault noauth default-asyncmap defaultroute hide-password nodetach mtu 1492 mru 1492 noaccomp nopcomp novj novjccomp lcp-echo-interval 20 lcp-echo-failure 3 disconnect /etc/ppp/disconnect &");

每执行一次都会产生一个pppd僵尸进程,且无法用killall 命令杀掉此进程  

网上查了下 原本后台程序用的signal(SIGPIPE,SIG_IGN); 后来换成signal(SIGCHLD,SIG_IGN); 想让init进程自己回收僵尸进程,但是也没有成功 而system 中&符号去掉的话 就不会产生僵尸进程 这是为什么呢?



------解决方案--------------------
你这段代码是运行在项目工程里的,我估计项目里是多进程或多线程在跑,这样是无法回收的。你试一下fork 然后让子进程运行,父进程非阻塞等待,这样发生密码错误的时候就会wait到了。
------解决方案--------------------
子进程exec
父进程定时waitpid(pid,&status,WNOHANG)检测返回值去判断子进程的状态,如果子进程已经退出父进程就发SIGKILL。