(1)阻塞block
  所谓阻塞方式block,顾名思义,就是进程或是线程执行到这些函数时必须等待某个事件的发生,如果事件没有发生,进程或线程就被阻塞,函数不能立即返回。
  例如socket编程中connect、accept、recv、recvfrom这样的阻塞程序。
  再如绝大多数的函数调用、语句执行,严格来说,他们都是以阻塞方式执行的。

(2)非阻塞non-block
  所谓非阻塞方式non-block,就是进程或线程执行此函数时不必非要等待事件的发生,一旦执行肯定返回,以返回值的不同来反映函数的执行情况,如果事件发生则与阻塞方式相同,若事件没有发生则返回一个代码来告知事件未发生,而进程或线程继续执行,所以效率较高。
  比如程序语句:int len=read(fd,buffer,BUFSIZE);函数read只读一次,不管读到数据或是没有读到数据,它都返回结果。又如while(1){len=read(fd,buffer,BUFSIZE);if(…)break;},虽然可以循环读取想要的数据,但它是非阻塞的,会大大地浪费系统资源。
  备注:在socket编程中使用:fcntl(sockfd,F_SETFL,O_NONBLOCK);会把sockfd设定为非阻塞模式,则之后的connect、accept、recv、recvfrom等函数便失去了阻塞功能,变成了非阻塞函数。

(3)select函数

int select(int maxfdp,fd_set *readfds,fd_set *writefds,fd_set *errorfds,struct timeval *timeout);

  上面的非阻塞式的while循环显然是不可取的,而失去阻塞功能的connect等函数也需要改进,对于这两种情况,select函数便可以大显身手了。
  关于select函数在这方面的使用,已经有两篇文章讲得十分清楚了:

http://blog.chinaunix.net/u/11557/showart_104967.html
http://blog.ednchina.com/thinkker/151601/message.aspx

关于select函数的使用,有几点需要注意的地方:
  maxfdp 为所有fd中的最大值加1.
  readfds 和 timeout 在每次执行select前都要重新初始化. 对于readfds,每次循环都要清空集合,否则不能检测描述符变化;而对于timeout,每次都要初始化其值,否则timeout被默认初始化为0.

//正确使用select函数的典型示例(程序段):
int Read(int fd, char *readbuf, int BUFSIZE)
{int len1,len2,nfds,select_ret;struct timeval timeout;fd_set readfds;FD_ZERO(&readfds);FD_SET(fd1, &readfds); FD_SET(fd2, &readfds);nfds=fd1>fd2?(fd1+1):(fd2+1);timeout.tv_sec = 1;timeout.tv_usec = 500000;while ((select_ret = select(nfds, &readfds, NULL, NULL, &timeout)) > 0){len1 += read(fd1, readbuf1 + len, BUFSIZE1 - len);len2 += read(fd2, readbuf2 + len, BUFSIZE2 - len);FD_ZERO(&readfds);FD_SET(fd1, &readfds); FD_SET(fd2, &readfds);nfds=fd1>fd2?(fd1+1):(fd2+1);timeout.tv_sec = 0;timeout.tv_usec = 500000;}readbuf1[BUFSIZE1-1]='\0';readbuf2[BUFSIZE2-1]='\0';return len1+len2;
}

阻塞、非阻塞的概念和select函数的阻塞功能相关推荐

  1. select函数的阻塞和非阻塞态理解(实践总结)

    1.select函数的阻塞和非阻塞 int select(int maxfdp,fd_set *readfds,fd_set *writefds,fd_set *errorfds,struct tim ...

  2. 利用select 函数 实现sleep功能 达到纳米级

    2019独角兽企业重金招聘Python工程师标准>>> 利用select 函数 实现sleep达到纳米级 . 当然这个数据计算出来不准确,本身就包含程序执行本身消耗的数量. 原理是把 ...

  3. select函数_SQL高级功能:窗口函数

    一.窗口函数有什么用? 在日常生活中,经常会遇到需要在每组内排名,比如下面的业务需求: 排名问题:每个部门按业绩来排名 topN问题:找出每个部门排名前N的员工进行奖励 面对这类需求,就需要使用sql ...

  4. select函数及fd_set介绍

    1. select函数 1. 用途 在编程的过程中,经常会遇到许多阻塞的函数,好像read和网络编程时使用的recv, recvfrom函数都是阻塞的函数,当函数不能成功执行的时候,程序就会一直阻塞在 ...

  5. 【精辟】socket阻塞与非阻塞,同步与异步,select,pool,epool

    socket阻塞与非阻塞,同步与异步 作者:huangguisu 1. 概念理解 在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调 ...

  6. linux非阻塞输入函数,Linux fcntl函数设置阻塞与非阻塞

    转自http://www.cnblogs.com/xuyh/p/3273082.html 用命令F_GETFL和F_SETFL设置文件标志,比如阻塞与非阻塞 F_SETFL     设置给arg描述符 ...

  7. 同步/异步,阻塞/非阻塞概念深度解析

    ‍‍ 原文:https://blog.csdn.net/lengxiao1993/article/78154467 更新:极客重生 网络IO作为网络编程核心基础知识,是所以程序员都需要理解掌握的,最近 ...

  8. 那些年搞不懂的多线程、同步异步及阻塞和非阻塞(二)---概念区分

    概念解释: 同步/异步, 它们是消息的通知机制 同步: 所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回. 简单来说就是当前程序执行完才能执行后面的程序,程序执行时按照顺序执行, ...

  9. connect函数在阻塞和非阻塞模式下的行为

    connect函数在阻塞和非阻塞模式下的行为 当socket使用阻塞模式时,connect函数会阻塞到有明确结果才会返回,如果网络环境较差,可能要等一会,影响体验, 为了解决这个问题,我们使用异步co ...

最新文章

  1. nodejs安装部署与运行
  2. jsoup 多个 class Selector 怎么写?
  3. Java基础篇:异常机制
  4. 用Python操作Redis
  5. DM9000调试记录
  6. 2020盲盒经济洞察报告
  7. ECSHOP 如何去掉配送区域
  8. jmeter之线程组如何使用
  9. Servlet面试题18道
  10. 需求:vue+svg实现连线功能
  11. 第二章、音频压缩算法
  12. Android 实现远程控制(类似QQ的远程协助)
  13. QQ邮箱炸啦,我的附件名怎么乱码?解决javaMail发送QQ邮件,附件名乱码的问题
  14. Yocto系列讲解[理论篇] 3 - meta layer recipe class概念介绍
  15. MS-DOS系统的操作命令
  16. 基于51单片机的简易电梯系统的设计
  17. python 写word图表标题_工作汇报神技!用Python三步生成带有图表的word报表
  18. 【MFC】数据库操作——ODBC(20)
  19. 深刻理解RGB色彩空间与HSI色彩空间的转换关系
  20. 在CSS中创建径向菜单

热门文章

  1. python属于计算机的什么语言_Python语言属于()_学小易找答案
  2. 火车头采集规则,火车头采集数据发布不小心设置了发布数量怎么修改?
  3. Python搭建自己[IP代理池]
  4. 分享四种将PDF文件转换为CAD文件的方法,总有一个方法适合你
  5. 可以媲美TortoiseSVN的LINUX版SVN客户端软件RabbitVCS
  6. 产品思考 - 印象笔记收费思考
  7. 使用scrapy框架抓取手机商品信息(2)
  8. godaddy biz域名续费优惠码
  9. 尚硅谷李立超老师讲解web前端网课笔记
  10. 硬币找零 acm入门 day4--动态规划dp第一题