多进程处理客户端请求框架如代码所示
for(;;){
connfd = Accept(listenfd, ...);
if((pid = fork()) == 0){
close(listenfd);
deal(connfd);
close(connfd);
exit(0);
}
close(connfd);
}
之所以要调用两次close(connfd)是因为每个文件或套接字都有一个引用计数,引用计数在文件表项中维护,是当前打开着的引用该文件或套接字的描述符的个数。accept返回后connfd引用计数变为1,调用fork后子进程复制父进程数据,引用计数变为2,而套接字真正的清理和资源释放要等到引用计数值达到0才发生。