服务器并发处理的时候如何避免僵尸进程的产生

当服务器处理多个请求链接的时候,常用的做法是收到一个请求,服务器就fork一个子进程,

如果父进程调用wait函数处理子进程结束时的状态信息,那么wait函数必须等待子进程的

结束,这时同一时刻服务器就只能处理一个请求,如果考虑不使用wait函数,那么接受一个

请求,结果就会产生一个僵尸进程,因为父进程一直fork,init进程也无法接管结束的子进

程,这时候,因为一台服务器产生的进程数是有限的,不是无限的,而僵尸进程有必然会占

据一个进程号,所以僵尸进程数目一定多的时候,会造成无法再处理新的请求链接。那么

如何避免这种情况的发生呢,就是使用两次fork函数。

伪代码:

  1. socket();
  2. bind();
  3. listen();
  4. while(1)
  5. {
  6. accept();
  7. while(1)
  8. {
  9. pid = fork();
  10. if(pid>0)
  11. {
  12. wait();
  13. }
  14. else if(pid==0)
  15. {
  16. pid2 = fork();
  17. if(pid2>0)
  18. {
  19. exit();
  20. }
  21. else if(pid2==0)
  22. {
  23. while(1)
  24. {
  25. process();//
  26. }
  27. close();
  28. exit();
  29. }
  30. }
  31. }
  32. }

图示:

这样就能够保证1快速处理多个请求链接,而且不会有僵尸进程的产生

来自为知笔记(Wiz)

时间: 2024-10-08 17:53:27

服务器并发处理的时候如何避免僵尸进程的产生的相关文章

这个可以程序主要测试高级并发服务器程序怎样写会避免僵尸进程?

#include <unistd.h> #include <stdio.h> #include<stdlib.h> #include<signal.h> int main(void) { //signal(SIGCHLD, SIG_IGN); int i=0; printf("i son/pa ppid pid fpid\n"); //ppid指当前进程的父进程pid //pid指当前进程的pid, //fpid指fork返回给当前进程的

服务器产生大量僵尸进程,查询并杀死zombie

一.服务器发生异常报警描述:服务器负载过高,达到160左右,网站访问正常 二.分析产生原因:php统计时,计划任务中的任务产生的大量僵尸进程 三.过程查看:     如何查看僵尸进程:     ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]' 四.解决方案: 如何杀死僵尸进程:(通过临时写下面脚本,杀死其父进程) #!/bin/bash for ZOMBIE in `ps -A -o stat,ppid,pid,cmd | grep -e '^[Zz]' |

TCP/IP 网络编程 (抄书笔记 3) -- 僵尸进程和多任务并发服务器

TCP/IP 网络编程 (抄书笔记 3) – 僵尸进程和多任务并发服务器 TCP/IP 网络编程 (抄书笔记 3) – 僵尸进程和多任务并发服务器 Table of Contents 僵尸进程的产生 避免僵尸进程 信号 多任务的并发服务器 僵尸进程的产生 子进程先退出, 父进程没有退出 ==> 僵尸进程 父进程先退出, 子进程没有退出 ==> 子进程被 0 号进程回收, 不会产生僵尸进程 pid_t pid = fork(); if (pid == 0) { // child printf(&

服务器cpu被大量僵尸进程占用

case info centos 6.5/RAID1+RAID5 服务器开机后大量进程占用cpu资源,居高不下,僵尸进程和负载越来越大,导致服务器各项服务不能正常使用 快速清理木马流程 假设木马的名字是nshbsjdy,如果top看不到,可以在/etc/init.d目录下面查看 1.首先锁定三个目录,不能让新木马文件产生 1 2 3 4 chmod 000 /usr/bin/nshbsjdy chattr +i /usr/bin chattr +i /bin chattr +i /tmp 2.删

Linux 网络编程六(多进程服务器僵尸进程解决方案)

僵尸进程解决方案 1.忽略SIGCHLD信号,这样不会出现僵尸进程 2.安装信号,父进程接收到SIGCHLD信号后,wait()子进程 注意:这里的客户端有两个进程,一个接收信息,一个发送信息,当客户端退出时,会将sockfd套接字关闭两次 //头文件 int server_socket(); int client_socket(); //服务器端 #include "pub.h" int main(int arg,char *args[]) { server_socket(); re

Exchange 2010 服务器中了木马,僵尸进程2270个

最近一直在忙系统迁移,忙的焦头烂额,根本没有时间维护公司的邮件服务器.上面有1000多人的邮箱啊. 今天上午11点,helpdesk电话我,说exchange上面的发垃圾邮件程序打不开了.我心想奇怪了.怎么会这样?我当时手上很多事情,就让他重启服务试试,重启完了,说还不行.有点重视了.远程桌面登上服务器一看,当时就傻眼了,2270个僵尸进程在跑.都是"tbviewer.exe,utilman.exe".明显中木马了.使用taskkill无法批量删除,下载个360急救箱,赶紧查杀木马.结

关于如何有效避免僵尸进程的一种探索。(动手写自己的http服务器)

关于如何避免僵尸进程.其实方法很多.有很多现成的解决方案.这里给出一个简单的方案.以及背后思考的过程. 设想一种最简单的http服务器: 伪代码: 当接收到一个tcp请求的时候. fork 一个子进程去做工作. 主进程依旧在监听下面要来的请求. 这个模型实际上会导致.因为fork出来的子进程没有回收,并且父进程一直存在没有结束.导致越来越多的僵尸进程出现. 都知道子进程结束的时候会发一个sigchld信号给父进程.于是改进成增加一行代码: signal(SIGCHLD,deal_signal);

这个模型用来测试并发服务器,是否会产生僵尸进程

#include <unistd.h> #include <stdio.h> #include<signal.h> int main(void) { signal(SIGCHLD, SIG_IGN); //一般来说在做并发服务器的时候,都要将这个加上!可以防止因为子进程退出时,父进程没时间处理,而产生僵尸进程! int i=0; printf("i son/pa ppid pid fpid\n"); //ppid指当前进程的父进程pid //pid指

服务器产生大量的僵尸进程

如何查看linux系统上的僵尸进程,如何统计有多少僵尸进程? #ps -ef | grep defunct 或者查找状态为Z的进程,Z就是代表zombie process,僵尸进程的意思. 另外使用top命令查看时有一栏为S,如果状态为Z说明它就是僵尸进程. Tasks:  95 total,   1 running,  94 sleeping,   0 stopped,   1617 zombie top命令中也统计了僵尸进程.或者使用下面的命令: ps -ef | grep defunct