如何回收僵尸进程

各位老大,用pidin可以发现许多僵尸进程,用kill和slay都杀不掉,请问能够编个程序回收这些僵尸进程吗?谁知道怎么做?先谢了

简单来说,如果父进程没有回收子进程,它就会变在僵死进程.
它们已经死了.自然是不能再KILL一回的了.
我想你要做的不是回收它们,而是不让它们出现.想办法让它们被自动回收.

如fork两次,让pid为1的进程成为你的进程的父进程.这样,当你的进程退出的时候,pid1的进程会为你清空它们.

如运行脚本自动运行你的程序时,在脚本最后加一句 exit

如创建线程时指定PTHREAD_CREATE_DETACHED

int main( void )
{
   pthread_attr_t attr;

   pthread_attr_init( &attr );
   pthread_attr_setdetachstate(
      &attr, PTHREAD_CREATE_DETACHED );
   pthread_create( NULL, &attr, &function, NULL );

   /* Allow threads to run for 60 seconds. */
   sleep( 60 );
   return EXIT_SUCCESS;
}

请问设置PTHREAD_CREATE_DETACHED 和PTHREAD_CREATE_JOINABLE
这两个参数在pthread_attr_setdetachstate()函数中的含义是什么,从帮助文档中我看得不是很明白。谢谢!

当一个进程(父进程)spawn()一个进程(子进程)后,标准的进程关系是要求子进程退出时,必须将退出状态通知父进程。

父进程必须调用wait*()函数来“接收”子进程。如果子进程通知了父进程但父进程没有“接收”,子进程进入僵尸状态。要避免这个现象有几种方法。

  1. 父进程设定处理 SIGCHLD 信号,在这个信号处理中,调用wait*()来“接收”子进程。

  2. 父进程设定忽略(SIG_IGNORE) SIGCHLD

  3. 在启动子进程的时候,让它脱离父子关系。通常的Unix的做法是

    if (fork() ==0) {
           setuid(); 
           exec();
      }

在QNX里子进程可以直接调用 procmgr_daemon() 函数。