使用waitpid避免僵尸进程
来源:互联网 发布:杭州麦苗网络怎么样 编辑:程序博客网 时间:2024/05/22 17:35
当我们写服务器程序时,需要考虑服务器通常会运行很长时间,所以必须要包括一个SIGCHLD处理程序,来回收僵死子进程的资源。
因为当SIGCHLD处理程序执行时,SIGCHLD信号是阻塞的,而UNIX信号是不排队的,所以SIGCHLD处理程序必须准备好回收多个僵死子进程的资源。
定义SIGCHLD处理程序:
void handler(int sig)
{
while (waitpid(-1,0,WNOHANG)>0)
echo();//process
return;
}
当有子进程终止时,父进程执行handler。假设在父进程执行handler的时候,有n个子进程终止(即有n个SIGCHLD信号被发送),当n>1时,就会有SIGCHLD被丢弃。
进程 终止时的信号
pid1 sig1
pid2 sig2
pid3 sig3
.
.
例如,当父进程在响应sig1的时候,进程pid2和pid3终止,发送了信号sig2和sig3,那么sig2被阻塞,sig3被丢弃。父进程在处理完sig1之后会对sig2做出响应。父进程对sig2的响应过程首先进入while循环,很明显此时有两个子进程终止,waitpid回收其中的一个(不确定是pid2还是pid3),然后调用echo(),再循环回收另一个。这样就不会出现僵尸进程了!
注意理解waitpid函数不是信号驱动的!
参考资料:http://bbs.chinaunix.net/thread-828942-1-1.html
- 使用waitpid避免僵尸进程
- 僵尸进程的产生和避免,以及wait,waitpid的使用
- 僵尸进程 wait() waitpid()
- 僵尸进程 wait() waitpid()
- 僵尸进程 wait() waitpid()
- 僵尸进程 wait waitpid
- linux僵尸进程产生的原因以及如何避免产生僵尸进程(waitpid应对多进程的情况)
- wait waitpid WNOHANG 僵尸进程
- wait、waitpid及僵尸进程
- 使用waitpid函数处理SIGCHLD信号-避免僵死进程
- 僵尸进程及其避免
- 避免僵尸进程
- 僵尸进程的避免
- 僵尸进程的避免 .
- 如何避免僵尸进程
- 如何避免僵尸进程
- 避免僵尸进程
- 僵尸进程 wait() waitpid() 【转 来源不详】
- HttpTunnel解读和防御
- 小项目
- wpf listView 始终显示最新五条
- 利用javascript onclick跳转链接网页
- 2013年工作中遇到的20个问题:241-260
- 使用waitpid避免僵尸进程
- 求助大神:Could not find the main class:
- How to detect when the client closes the connection?
- 我希望在软件开发生涯初期就知道的 4 件事
- 类的友函数、友类、继承、多继承
- 两分钟彻底让你明白Android Activity生命周期(图文)!
- [生活大杂烩-2] 人生需要四种修为
- Webview使用总结
- 使用多线程还是用IO复用select/epoll? epoll 或者 kqueue 的原理是什么?