+ -
当前位置:首页 → 问答吧 → 关于僵尸进程的几个深入问题,请指教

关于僵尸进程的几个深入问题,请指教

时间:2011-12-21

来源:互联网

1.为什么显式调用signal(SIGCHLD, SIG_IGN)才会避免僵尸进程的产生,但是系统已经默认对SIGCHLD忽略了啊??
2.如果程序一开始就调用signal(SIGCHLD, SIG_IGN),就不会出现僵尸进程,包括孙子进程退出的信号也可以捕获??(好像是这样)
3.在网络编程时,曾经出现这样的一段代码:

/* SIDCHLD信号处理函数 */  
vod sig_chld(int signo)  
{  
  pid_t pid;  
  int stat;  
   
  while ((pid = waitpid(-1, &stat, WNOHANG)) > 0);  
  return;  
}  

如果子进程exit(0),给信号处理函数捕获,但是waitpid的返回值是子进程的ID(大于0),结果为真,又做循环;难道第2次循环就会退出?这样写有什么好外??

作者: mo_hui123456   发布时间: 2011-12-21

必须这样, 因为信号不排队, 可能两个孩子退出只提交一次信号, 所以要循环到没有孩子退出为止.

作者: qq120848369   发布时间: 2011-12-21

《Windows编程启示录》
19.6 为什么有些进程在被终止之后还停留在任务管理器中
  当某个进程结束时(可能是正常结束,也可能是因为调用了像TerminateProcess之类的函数),这个进程的用户态模块将被删除。但内核态模块只有在与线程相关的所有驱动程序执行完成之后才会被删除。
  例如,如果某个线程正处于I/O操作中,那么将会给负责I/O的驱动程序发送一个内核信号来取消这个操作。
  如果驱动程序的行为是良好的,那么它将清除与这个未完成I/O相关的一些信息并且释放线程。
  如果驱动程序的行为是不好的(可能是因为驱动程序管理的硬件表现出奇怪的行为),那么可能需要花很长的时间来清除这个未完成的I/O。在这段时间里,驱动程序将不会释放这个线程(以及这个线程所在的进程)。实际的情况要更复杂一些,但这里的简单模型对于我们的讨论已经足够。
  ……
  换句话说,如果你终止了某个进程后还能在任务管理器中看到这个进程,那么实际上这个进程已经停止运行了,只不过还有些残留的信息保留在系统中,只有当与这个进程相关的所有驱动程序都完成了清除操作并且指向这个进程的句柄都已经关闭,进程才会完全消失。

作者: zhao4zhong1   发布时间: 2011-12-21