select/poll 函数

来源:互联网 发布:中电云集 mysql root 编辑:程序博客网 时间:2024/05/20 00:36

异步I/O,基本思想是进程告诉内核,当一个描述符已经准备好可以进行I/O时,用一个信号通知它。

实现异步I/O的一种较好的技术是I/O多路复用(I/O multiplexing)。先构造一张有关描述符的列表,然后调用一个函数,直到这些描述符中的一个已准备好进行I/O时,该函数返回。在返回时,它告诉进程哪些描述符已准备好可以进行I/O。

Select和Poll这两个函数就可以帮助我们实现I/O多路复用。

Select函数为:

#include <sys/select.h>int select(int maxfdp1, fd_set *restrict readfds,fd_set *restrict writefds, fd_set *restrict exceptfds,struct timeval *restrict tvpir);
fd_set是一个为每一个描述符提供一个位的数据结构。在申请了一个fd_set描述符集后,需要用FD_ZERO清除所有位,如下:

fd_set rset;FD_ZERO(&rset);
可以通过FD_SET根据一个fd来设置fd_set中与它相关的位,比如:

int fd;FD_SET(fd, &rset);
函数中3个fd_set表示我们所关心的三类事件。

最后一个参数struct timeval *tvpir为select等待的时间。

在select返回时,用FD_ISSET测试fd_set中的一个给定位是否仍旧设置,如果某个给定位仍然设置,则可以在该fd上进行I/O操作或与异常相关的操作。

函数的第一个参数maxfdp1为“最大描述符+1”,在后面三个描述符集中找出最大描述符编号值然后加1就是第一个参数值。


应当注意的是,一个描述符阻塞与否并不影响select是否阻塞。


0 0
原创粉丝点击