fd_set与select

来源:互联网 发布:mysql 执行脚本文件 编辑:程序博客网 时间:2024/05/05 22:01

select()函数原型中,用到了很多fd_set*这样的指针变量。当我学习的时候,不是很理解这种写法到底是什么意思。

int select(int nfds,  fd_set* readset,  fd_set* writeset,  fe_set* exceptset,  struct timeval* timeout);这是我们熟知的select函数原型,这个函数可以做到很好的监听作用,监听读、写、报错、设置监听时间。但是看到那么多的set_fd*指针时,我迷茫了,刚开始,我只是可根据fd来推测出这是一个文件描述符。后来通过学习发现,这是一个宏定义数组,其中有很多数组可以定义,可以根据自己的需要进行设置。譬如说,我们只想监听函数的写操作时,函数定义如下:

int select(1,  NULL, &fdset, NULL, &tv);我们只需要把相应写操作那写入参数地址即可。

但是如何定义fdset呢,这就是fd_set()函数的功能了。在调用select()函数前,需要先对fdset进行定义。

Linux内核中,给我们提供了4个fd_set操作宏,FD_ZERO();FD_SET();FD_CLR();FD_ISSET();我们可根据自身的需要对其进行一一操作。最后将fdset地址写入select函数即可。

以此类推,也可以完成单独的读、写、错误,或者一些复合的IO操作。
原创粉丝点击