加入收藏 | 设为首页 | 会员中心 | 我要投稿 武汉站长网 (https://www.027zz.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

Linux系统文件I/O编程(三) I/O多路复用

发布时间:2016-09-20 09:57:41 所属栏目:Linux 来源:站长网
导读:多路复用 函数说明 我们都知道fcntl()函数解决了文件共享的问题,如果不知道请看: http://blog.csdn.net/mybelief321/article/details/8993138。接下来该处理I
副标题[/!--empirenews.page--]

多路复用

函数说明

我们都知道fcntl()函数解决了文件共享的问题,如果不知道请看: http://blog.csdn.net/mybelief321/article/details/8993138。接下来该处理I/O复用的情况了。那么,什 么是I/O复用呢?这个咱得先弄清楚,所谓的I/O复用无非就是多个进程共同使用一个I/O输入输出流。

在经典的《Unix网络编程第1卷》Chapter 6中作者详细介绍了五种I/O模型,分别为:

① blocking I/O

② nonblocking I/O

③ I/O multiplexing (select and poll)

④ signal driven I/O (SIGIO)

⑤ asynchronous I/O (the POSIX aio_functions)

我英语水平一般,还是换成中文的来 说吧。I/O处理的模型有5种:

① 阻塞I/O型:在这种模式下,若所调用的I/O函数没有完成相关的功能 ,则会使进程挂起,直到相关数据到达才会返回。如常见对管道设备、终端设备和网络设备进行读写时经常会 出现这种情况。

② 非阻塞I/O型:在这种模式下,当请求的I/O操作不能完成时,则不让进程睡眠,而 且立即返回。非阻塞I/O使用户可以调用不会阻塞的I/O操作,如open()、write()和read()。如果该操作不能 完成,则会立即返回出错(如打不开文件)或者返回0(比如在缓冲区中没有数据可以读取或者没有空间可以 写入数据)。

③ I/O多路转接模型:在这种模式下,如果请求的I/O操作阻塞,且它不是真正的阻塞 I/O,而是让其中的一个函数等待,在此期间,I/O还能进行其他操作。咱们接下来要说的select()函数和 poll()函数,就是属于这种类型。

④ 信号驱动I/O模型:在这种模式下,进程要定义一个信号处理程 序,系统可以自动捕获特定信号的到来,从而启动I/O。这是由内核通知用户何时可以启动一个I/O操作决定的 。这种模型是非阻塞的,当有就绪的数据时,内核就向该进程发送SIGIO信号。无论我们如何处理SIGIO信号, 这种模型的好处就是当等待数据到达时,可以不阻塞。主程序继续执行,只有收到SIGIO信号时,才去处理数 据即可。

⑤ 异步I/O模型:在这种模型下,进程先让内核启动I/O操作,并在整个操作完成后通知该进 程。这种模型与信号驱动模型的主要区别在于:信号驱动I/O是由内核通知我们何时可以启动一个I/O操作,而 异步I/O模型是由内核通知进程I/O操作何时完成的。现在并不是所有的系统都支持这种模型。

相比较 而言,select()和poll()的I/O多路转换模型是处理I/O复用的一个高效的方法。它可以具体设置程序中每一个 所关心的文件描述符的条件、希望等待的时间等,从select()函数和poll()函数返回时,内核会通知用户已准 备好的文件描述符的数量、已准备好的条件(或事件)等。通过使用select()和poll()函数的返回结果(可能 是检测到某个文件描述符的注册事件或是超时,或是调用出错),就可以调用相应的I/O处理函数了。

函数格式

下图为select()函数的介绍

Linux系统文件I/O编程(三) I/O多路复用

可以看到,select函数根据希望进行的文件 操作对文件描述符进行了分类,这里对文件描述符的处理主要涉及4个宏函数,如下表2所示

Linux系统文件I/O编程(三) I/O多路复用

另外,select()函数中的 timeou 是一个 struct timeval类型的指针,该结构体如下所示:

Linux系统文件I/O编程(三) I/O多路复用

(编辑:武汉站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读