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

当服务器处理多个请求链接的时候,常用的做法是收到一个请求,服务器就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快速处理多个请求链接,而且不会有僵尸进程的产生





posted @ 2015-06-05 16:45  外禅内定,程序人生  阅读(555)  评论(0编辑  收藏  举报