博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
并发服务器
阅读量:6363 次
发布时间:2019-06-23

本文共 941 字,大约阅读时间需要 3 分钟。

当服务一个客户请求可能花费较长时间时,我们并不希望整个服务器被单个客户长期占用,而是希望同时服务多个客户

unix中编写并发服务器程序最简单的方法就是fork一个子进程来服务每个客户

======================

典型的并发服务器程序轮廓

=====================

pid_t pid;int listenfd,connfd;listenfd = socket(...);bind(listenfd,...);for(;;){    connfd = accept(listenfd,...);    if((pid = fork()) == 0)    {        close(listenfd);//子进程关闭listening socket        doit(connfd);//处理请求        close(connfd);//客户执行完毕,关闭已经连接的socket        exit(0);//子进程结束    }    close(connfd);//父进程关闭已经连接的socket}

当一个连接i建立时,accpt返回,服务器接着调用fork,然后由子进程服务客户,父进程则等待另一个连接

既然新的客户由子进程提供服务,父进程就关闭已连接套接字

 

对一个TCP套接字调用close会导致发送一个FIN,随后是正常的TCP连接终止序列

但为什么父进程调用close没有终止它与客户的连接呢?

我们必须知道每个文件或套接字都有一个引用计数,引用计数在文件表项中记录,他是当前打开着的引用该文件或套接字的个数

 

socket返回后与listenfd关联的文件表项的引用记数值为1

accept返回后与connfd关联的文件表项的引用计数为1

然而fork返回后,这2个描述符就在父进程与子进程间共享(被复制一份到子进程),因此与这2个套接字相关连的文件表项各自的访问计数值均为2

这么一来,当父进程关闭connfd时,它只是把相应的引用计数值从2减为1

该套接字真正的清理和资源释放需要等到其引用计数值达到0时才发生

转载于:https://www.cnblogs.com/ailx10/p/5350466.html

你可能感兴趣的文章
JQuery学习笔记-JQuery的CSS DOM操作
查看>>
AngularJS 字符串-ng-bind
查看>>
关于质数的数学算法
查看>>
bootstrap-水平表单
查看>>
vsftpd详解及实例配置
查看>>
正式学习 React(三)番外篇 reactjs性能优化之shouldComponentUpdate
查看>>
openindiana通过源码安装软件方法
查看>>
html中的行内元素和块级元素有哪些。
查看>>
Windows server 2008 R2 登录密码恢复
查看>>
运维排错思路分享之“用户重复收到了密码到期提醒邮件?”
查看>>
windows 资源监控常用指标分析
查看>>
Linux忘记 root密码的解决办法
查看>>
通用性好的两组2k3 server sn
查看>>
python操作文件
查看>>
spec打包方法
查看>>
CENTOS下安装phpmyadmin提示:缺少mcrypt,请检查PHP配置
查看>>
用python实现调用jar包
查看>>
父元素与子元素之间的margin-top问题(css hack)
查看>>
Visual Studio安装项目中将用户选择的安装路径写入注册表的方法[转]
查看>>
【转载】VBA:调用文件夹对话框的几种方法
查看>>