简单的并发服务器
UNIX下编写简单的并发服务器最简单的方法就是fork一个子进程来服务每个客户。
pid_t pid;
int listenfd, connfd;
listenfd = socket();
bind(listenfd, );
listen(listenfd, LISTENQ)
for(; ;)
{
connfd = accpet(listenfd, );
if((pid = fork()) == 0)
{
close(listenfd);
doit(connfd);
close(connfd);
exit(0);
}
close(connfd);
}
当一个连接建立时,accpet返回,服务器紧跟着调用fork,然后父进程关闭已连接套接字子进程关闭监听套接字。
为什么父进程调用close(connfd)没有终止子进程与客户的连接呢?
这就要理解APUE上讲的fork函数了,每个文件或者套接字都有一个引用计数,引用计数在文件表项中维护。他是当前打开着的引用该文件或套接字描述符的个数。
在本例中,socket函数返回后与listenfd关联的引用计数为1.在accept函数返回后与connfd关联的引用计数也为1.在fork函数返回后与listenfd和connfd关联的引用计数为2.当父进程关闭connfd时只是将他的引用计数从2减为1.该套接字的真正清理和资源释放都是在引用计数减为0的时候进行。