在Linux下,可以调用fork()函数创建新的进程。父进进程的一个责任就是当子进程结束之后,调用wait4()系统函数对其进行回收。如果在父进程没有及时处理(比如,在运行一个很耗费时间的循环),那么子进程由于没有被及时回收,就被标记为Zombie进程。
为了避免Zombie进程的出现,有以下方法可以解决:
1 两次fork()
首先说一下,如果父进程在子进程结束前就运行完了,那么Linux会自动地将子进程的父亲修改为init进程,这样就由init进程来负责对子进程的回收工作。于是,可以用下面的代码来防止Zombie进程的出现:
pid = fork(); // 第一次fork
if (pid == 0) { // 子进程
pid = fork(); // 第二次fork
if (pid == 0) {
// 子进程代码
} else { // 中间生成的父进程,立即退出
exit(0);
}
} else {
// 父进程代码
}
以上代码通过两次fork,一共产生了3个进程,第二次fork时的父进程通过exit()直接退出了,这就使得最终的子进程被移交给inti线程进行回收工作,于是避免了Zombie进程的出现。
2 忽略SIGCHLD信号
当子进程结束的时候,系统会向父进程发出一个SIGCHLD信号,通知子进程的完结。如果我们显示地忽略这个信号,那么子进程就不再需要等待父进程的回收。可以通过如下代码实现:
signal(SIGCHLD, SIG_IGN); // 显示忽略信号
// 之后开始fork操作
pid = fork();
3 使用waitpid等待子进程结束
这个就很显然了,保证了子进程在父进程之前结束,于是也就避免了Zombie进程的出现。
Wednesday, April 8, 2009
Subscribe to:
Post Comments (Atom)

0 comments:
Post a Comment