您的位置:首页 > 其它

僵尸进程和守护进程

2013-05-10 14:23 225 查看
1、僵尸进程

僵尸进程,即一个进程使用fork创建子进程,如果子进程在退出时,父进程没有使用wait或waitpid函数获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中,这种进程就叫僵尸进程,通过ps命令可以看到很多状态为defunct的进程,这些就是僵尸进程。

但是如果该进程的父进程已经先结束了,那么该进程就不会变成僵尸进程。因为每个进程结束的时候,系统都会扫描当前系统中所运行的所有进程,看看有没有哪个进程是刚刚结束的这个进程的子进程,如果是的话,就由Init进程来接管他,成为他的父进程,从而保证每个进程都会有一个父进程。而Init进程会自动wait其子进程,因此被Init接管的所有进程都不会变成僵尸进程。

2、如何避免僵尸进程

(1) 父进程通过wait和waitpid等函数等待子进程结束,这会导致父进程挂起。执行wait()或waitpid()系统调用,则子进程在终止后会立即把它在进程表中的数据返回给父进程,此时系统会立即删除该进入点。在这种情形下就不会产生defunct进程。

(2) 如果父进程很忙,那么可以用signal函数为SIGCHLD安装handler。在子进程结束后,父进程会收到该信号,可以在handler中调用wait回收。

(3) 如果父进程不关心子进程什么时候结束,那么可以用signal(SIGCLD, SIG_IGN)或signal(SIGCHLD, SIG_IGN)通知内核,自己对子进程的结束不感兴趣,那么子进程结束后,内核会回收,并不再给父进程发送信号。

(4) fork两次,父进程fork一个子进程,然后继续工作,子进程fork一个孙进程后退出,那么孙进程被init接管,孙进程结束后,init会回收。不过子进程的回收还要自己做。fork两次避免僵尸进程有一个好处就是,若子进程是一个工作量很大的进程,父进程若使用wait等待子进程的话,父进程就会一直阻塞,但是使用fork两次就可以解决父进程阻塞的问题。

3、守护进程

守护进程(Daemon),是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。守护进程是一种很有用的进程,Linux

的大多数服务器就是用守护进程实现的,比如,Internet服务器inetd,Web服务器httpd等。同时,守护进程完成许多系统任务,比如作业规划进程crond,打印进程lpd等。

4、如何实现守护进程

参考:/article/8051633.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: