http://www.blogbus.com/eastsun-logs/7762285.html

摘自《UNIX NETWORK PROGRAMMING》chapter 6

p144

对于常见的input操作,一般分为两个步骤:

1.  wait to be ready

2.  copy data from kernel buffer to user buffer

常见的I/O模型:(参见以上步骤)

1.  阻塞I/O                               用户进程执行1、2

2.  非阻塞I/O                           用户轮巡1,然后执行2

3.  多路复用select、poll            用户调用select等待kernel返回,然后执行2

4.  信号驱动I/O(SIGIO)              用户设置信号处理函数(sigio)后,正常继续其他函数,当kernel返回SIGIO后,执行2

5.  异步信号I/O                        kernel执行1、2后通知用户进程(不常用)

# include <sys/select.h>

# include <sys/time.h>

int select(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset, const struct timeval *timeout);

作用:

1.  内核扫描maxfdp1个描述符(常规情况下,系统最大值FD_SETSIZE=1024,可修改)

2.  内核查看readset, writeset, exceptset集中的描述符是否准备好

3.  等待超过timeout时间而没有描述符准备好,select返回

struct timeval {

long tv_sec;

long tv_usec;

}

注:timeval == 0   马上返回

timeval == NULL   永久阻塞

void FD_ZERO(fd_set *fdset);

void FD_SET(int fd, fd_set *fdset);

void FD_CLR(int fd, fd_set *fdset);

void FD_ISSET(int fd, fd_set *fdset);

注意,如循环调用select,多次检查同一描述符,必须在调用select之前重新设定初始值。select函数会在每次返回时,将没有ready的描述符所在的位清0

任何信号将使select()出错返回。而且BSD系统的select将不可能自动再启动

在标准select()中,返回后系统不会改变timeval的值,而linux系统例外。

exception condition:

当前只支持  out-of-band和the presence of control status information to be read from the master side of a pseudo terminal that has been put into packet mode.(???)

一般的系统实现中,将fd_set设置为整数队列,每个整数元素中的一位表示为一个描述符

FD_SETSIZE定义在<sys/select.h>中,如果要更改的话,必须重新编译内核

select()的常见错误:

1.  maxfdp1必须指定为最大描述符值+1

2.  每次select返回后,都会将fd_set中的初值清0,除非该描述符已经准备好。因此,如果要重新检查描述符,必须再次赋初值

在select返回的描述符个数中,如果同一描述符同时为读、写准备好,则记数2次

早期的SVR4版本只记录1次。(bug)

select中准备好的意义:

为读准备好:

1.  在socket接受缓存中的数据 >= SO_RCVLOWAT,默认情况下,SO_RCVLOWAT=1

2.  对端写关闭,read返回0

3.  在listenfd中的complete queue 中,有entry

4.  socket出错。read返回-1

为写准备好:

1.  在socket发送缓存中的数据 >= SO_SNDLOWAT,默认情况下,SO_SNDLOWAT=2048

2.  对端读关闭,kernel返回SIGPIPE

3.  socket出错,write返回-1

注意,当socket出错时,将在readset/writeset分别赋值

使用select应该注意:

由于同时处理单个描述符的读写,可能出现此描述符的写(或读)操作已全部完成,而相对的另一个读(或写)操作还没有完成。为了获得这些数据,进程必须调用shutdown()以进行半关闭

# include <sys/socket.h>

int shutdown(int sockfd, int howto);

其中,howto可以置为SHUT_RD/SHUT_WR/SHUTRDWR

区别于close():

1.  shutdown不查看描述符计数器。直接进行半关闭

2.  close只能进行全关闭,shutdown可以选择一端或两端

服务器处理客户机请求的原则:永远不要将服务器阻塞在一个客户连接中。(可能被dos攻击)

# include <sys/select.h>

# include <signal.h>

# include <time.h>

int pselect(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *except_set, const struct timespec *timeout, const sigset_t sigmask);

http://www.blogbus.com/eastsun-logs/7762285.html相关推荐

  1. 从工作组向域管理转型该如何设置?

    来源于链接:[url]http://gnaw0725.blogbus.com/[/url] /logs/4888469.html 从工作组向域管理转型该如何设置?许多从工作组转向域管理模式的朋友们都会 ...

  2. http://bigwhite.blogbus.com/logs/1347304.html

    也谈内存对齐 - [技术前沿] Tag:语言探索 版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明 http://bigwhite.blogbus.com/logs/1347304.h ...

  3. Visual Studio 2005/2008/2010 简单更换配色主题(转自:http://apit.blogbus.com/logs/84846293.html)

    其实原来也没有什么简单的办法直到出现了这个站点, studiostyles 这个站点以导出的设置形式来提供支持 VS 2005/2008/2010的配色方案,并且有一个非常方便的工具用来制作自己的配色 ...

  4. arrays 和array的区别 blogbus

    http://b0r0j0.blogbus.com/logs/1646758.html J2SE综合:对java.util的总结6 15.9 Arrays (数组) Java 2在java.util中 ...

  5. blogbus.com(博客大巴)XSS跨站漏洞

    漏洞测试过程:  1.申请了一个帐号  2.进入后台--博客--模板--首页布局设置--文章内容[编辑]  3.在对话框中的编辑链接处加上跨站代码或进入文章发布  切换编辑器至HTML模式  4.测试 ...

  6. mysql中logs库_MySQL Logs

    摘要 一.MySQL日志 1.1 查询日志 1.2 慢查询日志 1.3 错误日志 1.4 二进制日志 一. MySQL日志 MySQL服务器上一共有六种日志:错误日志,查询日志,慢查询日志,二进制日志 ...

  7. 日志管理之 Docker logs - 每天5分钟玩转 Docker 容器技术(87)

    高效的监控和日志管理对保持生产系统持续稳定地运行以及排查问题至关重要. 在微服务架构中,由于容器的数量众多以及快速变化的特性使得记录日志和监控变得越来越重要.考虑到容器短暂和不固定的生命周期,当我们需 ...

  8. Valve className=org.apache.catalina.valves.AccessLogValve directory=logs prefix=localhost_acce

    在tomcat/conf/server.xml里的<host>标签下加上 <Valve className="org.apache.catalina.valves.Acce ...

  9. docker logs 查看实时日志

    docker logs -f -t --since="2017-05-31" --tail=10 edu_web_1 --since : 此参数指定了输出日志开始日期,即只输出指定 ...

最新文章

  1. SQL脚本--有关压缩数据库日志
  2. 别以为真懂Openstack: 虚拟机创建的50个步骤和100个知识点(5)
  3. 性能测试、负载测试、压力测试的区别
  4. mysql主从复制同步
  5. 微信平台全面封杀UBER的24小时里,优步做了什么
  6. @Value和Hibernate问题
  7. 如何使用log.debug()
  8. 计算机一级考试教学设计,《全国计算机一级考试》教学设计说明.doc
  9. js获取数组中最大和最小值
  10. 神州数码否认买下华为荣耀,股价连续第二日涨停,创历史新高!
  11. 无法推送到GitHub-一直说需要合并
  12. iOS底层探索之类的加载(二): realizeClassWithoutSwift分析
  13. Word2007发布文章成功
  14. 酉矩阵(幺正矩阵、unitary matrix)
  15. 关于车载 时间同步 的理解
  16. 软件测试实验-决策表
  17. 运放自激震荡的大杂烩总结
  18. 数据库学习7 — 嵌套查询
  19. Ty学习笔记-Redis6
  20. 二维码制作方法有哪些?教你简单的二维码制作方法

热门文章

  1. 【python】取txt文件中的单词存到SQLite数据库,并且从bing词典爬取单词详情
  2. 论文汇网站第三期改版完成
  3. Debian10开启路由转发以及配置dhcp中继
  4. 视频压缩编码问答--转载
  5. 求1到100之间的素数
  6. 新品周刊 | 昕诺飞发布飞利浦智能照明产品;AO史密斯推出新品空气净化器
  7. c语言查找偶数,c-查找数字是偶数还是奇数的最快方法是什么?
  8. Vue实现百度下拉提示搜索
  9. 如何做好成本管理???
  10. 我在CSDN和Unity有个约会