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