各位老大,用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*()函数来“接收”子进程。如果子进程通知了父进程但父进程没有“接收”,子进程进入僵尸状态。要避免这个现象有几种方法。
-
父进程设定处理 SIGCHLD 信号,在这个信号处理中,调用wait*()来“接收”子进程。
-
父进程设定忽略(SIG_IGNORE) SIGCHLD
-
在启动子进程的时候,让它脱离父子关系。通常的Unix的做法是
if (fork() ==0) {
setuid();
exec();
}
在QNX里子进程可以直接调用 procmgr_daemon() 函数。