当前位置:  技术问答>linux和unix

关于僵死进程

    来源: 互联网  发布时间:2016-03-07

    本文导语:  我的程序是长时间运行的程序,主循环用了while(1)循环。程序运行在arm-linux环境下。 开机自动运行,在/etc/init.d/rc.sysinit中最后一行调用我的程序/tmdt/xxxx 那么问题就出来了,用ps查看进程,发现会有名为sh的僵死...

我的程序是长时间运行的程序,主循环用了while(1)循环。程序运行在arm-linux环境下。
开机自动运行,在/etc/init.d/rc.sysinit中最后一行调用我的程序/tmdt/xxxx

那么问题就出来了,用ps查看进程,发现会有名为sh的僵死进程。对我的程序的影响是:在程序中启动bftpd服务,然后用kill方式结束bftpd进程的时候,会出现两个名为bfptd的僵死进程,导致结束进程失败,程序不能继续执行。

后来将/etc/init.d/rc.sysinit中的调用语句改为/tmdt/xxxx& ,让程序在后台运行,则这些僵死进程就没有了,程序也运行正常。但是程序的屏幕输出都没有了,因为是后台运行。

虽然问题解决了,但不能显示输出也是美中不足。而且对于这个现象我还不清楚原因,请高手指点指点,不胜感激!

此致:回贴者2008顺利!幸福!开心!


|


难道楼主用的是printf输出?作为一个后台运行的服务端,肯定要用文件作为输出的,一个例子:


#define myprintf(fmt,arg...) 
do{
fprintf(eventlog, fmt, ##arg); 
fflush(eventlog); 
}while (0)


另外/etc/init.d中的启动脚本本来就有一个原则,就是不能让他们阻塞,通常服务端都是要加&让他们后台执行的

|
system("/tmdt/bftpd   -c   /tmdt/bftpd.conf   -d"); 

参数 -d 是不是 debug 模式,是否应该去掉,或者使用其他参数

|
可以试试下面的方法:
7.处理SIGCHLD信号。SIGCHLD信号是子进程结束时,向内核发送的信号。 

如果父进程不等待子进程结束,子进程将成为僵尸进程(zombie)从而占用系统资源。因此需要对SIGCHLD信号做出处理,回收僵尸进程的资源,避免造成不必要的资源浪费。可以用如下语句:
    signal(SIGCHLD,(void *)reap_status); 

    捕捉信号SIGCHLD,用下面的函数进行处理: 

void reap_status() 
 { int pid; 
   union wait status; 
   while ((pid = wait3(&status,WNOHANG,NULL)) > 0) 
  …… }

来自:
http://bjcert.beijingit.gov.cn/cenep/portal/user/anon/page/bjtec_CMSItemInfoPage.page?appId=00000000000000000178&categoryCode=200100&metainfoId=ABC00000000000063806

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 虚拟机僵死打不开小红帽是咋弄的啊?
  • thread正常结束也是进入僵死状态么?
  • 为什么程序会僵死在控制台下??
  • 内核线程僵死如何解决?
  • Linux程序僵死问题,求助


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3