2411|0

1560

帖子

24

TA的资源

五彩晶圆(初级)

楼主
 

2440学习(八)Linux I/O多路复用 [复制链接]

本帖最后由 lonerzf 于 2014-7-27 21:36 编辑

这一帖主要记录linux的I/O复用学习。主要内容有select,poll,epoll用法。
今儿个先记录poll 函数

主要参考文献: blog.csdn.net/mybelief321/article/details/8997596
blog.csdn.net/ithomer/article/details/6126712
blog.csdn.net/blueboy2000/article/details/4485874

一、Linux下五种I/O模型

1、阻塞I/O模型
     最流行的I/O模型是阻塞I/O模型,缺省情形下,所有套接口都是阻塞的。我们以数据报套接口为例来讲解此模型(我们使用UDP而不是TCP作为例子的原因在于就UDP而言,数据准备好读取的概念比较简单:要么整个数据报已经收到,要么还没有。然而对于TCP来说,诸如套接口低潮标记等额外变量开始活动,导致这个概念变得复杂)。
     进程调用recvfrom,其系统调用直到数据报到达且被拷贝到应用进程的缓冲区中或者发生错误才返回,期间一直在等待。我们就说进程在从调用recvfrom开始到它返回的整段时间内是被阻塞的。
2、非阻塞I/O模型
      进程把一个套接口设置成非阻塞是在通知内核:当所请求的I/O操作非得把本进程投入睡眠才能完成时,不要把本进程投入睡眠,而是返回一个错误。也就是说当数据没有到达时并不等待,而是以一个错误返回。
3I/O复用模型
     调用selectpoll,在这两个系统调用中的某一个上阻塞,而不是阻塞于真正I/O系统调用。 阻塞于select调用,等待数据报套接口可读。当select返回套接口可读条件时,调用recevfrom将数据报拷贝到应用缓冲区中。
4、信号驱动I/O模型
     首先开启套接口信号驱动I/O功能, 并通过系统调用sigaction安装一个信号处理函数(此系统调用立即返回,进程继续工作,它是非阻塞的)。当数据报准备好被读时,就为该进程生成一个 SIGIO信号。随即可以在信号处理程序中调用recvfrom来读数据报,井通知主循环数据已准备好被处理中。也可以通知主循环,让它来读数据报。
5、异步I/O模型
     告知内核启动某个操作,并让内核在整个操作完成后(包括将数据从内核拷贝到用户自己的缓冲区)通知我们。
   这种模型与信号驱动模型的主要区别是:
     信号驱动I/O:由内核通知我们何时可以启动一个I/O操作,
     异步I/O模型:由内核通知我们I/O操作何时完成。

二、I/O复用的典型应用场合
1、当客户处理多个描述字(通常是交互式输入和网络套接口)时,必须使用I/O复用。
2、如果一个服务器要处理多个服务或者多个协议(例如既要处理TCP,又要处理UDP),一般就要使用I/O复用。

三、poll函数的实验


pollfd中的events请预先设置。可选值如下:
当poll()函数返回正值时,代表满足响应事件的文件描述符的个数,如果返回0则代表在规定事件内没有事件发生。如发现返回为负则应该立即查看 errno,因为这代表有错误发生。 如果没有事件发生,revents自动被清空。

程序流程图如下:

实验代码如下:
multiplex_poll.rar (1.24 KB, 下载次数: 6)


操作方法:
先在工作目录下新建in1和in2两个管道文件。
mknod in1 p
mknod in2 p
执行程序 ./multiplex_poll


打开新的终端并进入工作目录,输入cat > in1
然后再键入字符,会发现终端1会显示当前终端输入的字符,程序正确。


四、小结
这一节只记录poll,还有select 下节继续。






此帖出自Linux开发论坛

赞赏

1

查看全部赞赏

点赞 关注
个人签名这孩子,成熟的象征,理智的典范。

回复
举报
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表