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