当服务器处理多个请求链接的时候,常用的做法是收到一个请求,服务器就fork一个子进程,如果父进程调用wait函数处理子进程结束时的状态信息,那么wait函数必须等待子进程的结束,这时同一时刻服务器就只能处理一个请求,如果考虑不使用wait函数,那么接受一个请求,结果就会产生一个僵尸进程,因为父进程一直fork,init进程也无法接管结束的子进程,这时候,因为一台服务器产生的进程数是有限的,不是无限的,而僵尸进程有必然会占据一个进程号,所以僵尸进程数目一定多的时候,会造成无法再处理新的请求链接。那么如何避免这种情况的发生呢,就是使用两次fork函数。
socket(); bind(); listen(); while(1) { accept(); while(1) { pid = fork(); if(pid2>0) { wait(); } else if(pid==0) { pid2 = fork(); if(pid2>0) { exit(); } else if(pid2==0) { while(1) { process();// } close(); exit(); } } } }
图示:
这样就能够保证1快速处理多个请求链接,而且不会有僵尸进程的产生
转载请注明:晋坤 的博客 » 服务器并发处理如何避免僵尸进程