IO复用——poll系统调用

1、poll函数

#include<poll.h>
int poll(struct pollfd* fds, nfds_t ndfs, int timeout)

    poll函数在一定的时间内轮询一定数量的文件描述符,检测是否有文件描述符就绪。参数解析如下:

  • fds为一个pollfd结构类型数组,用来指定用户感兴趣的文件描述符,并返回文件描述符上发生的可读、可写和异常事件 
  • nfds指定被监听事件集合fds的大小,类型定义为typedef unsigned long int nfds_t
  • timeout指定超时时间,单位为毫秒,timeout为-1时,poll永远阻塞,知道某个事件发生,为0时,poll调用立即返回
  • poll函数的返回值与select函数的返回值含义相同

    pollfd结构定义如下:

struct pollfd
{
    int fd;         //文件描述符
    short events;   //注册的时间,一系列事件的按位或
    short revents;  //实际发生的事件,由内核修改,用来通知应用程序fd上发生的事件
}

2、索引poll返回的就绪文件描述符程序示例

int ret = poll(fds, MAX_EVENT_NUM, -1)
for(int i = 0; i < MAX_EVENT_NUM; i++)
{
	if(fds[i].revents & POLLIN)  //判断第i个文件描述符是否读就绪
	{
		int socket = fds[i].fd;

		//处理socket
		
	}
}	

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
多路 I/O 复用是一种在系统编程中常用的技术,它允许一个进程同时监视多个 I/O 事件,以提高程序的效率和响应能力。在 C 语言中,一个常用的多路 I/O 复用函数是 `select`。 `select` 函数的原型如下: ```c #include <sys/select.h> int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); ``` 参数说明: - `nfds`:监视的文件描述符集合中最大的文件描述符值加1。 - `readfds`:读事件的文件描述符集合。 - `writefds`:写事件的文件描述符集合。 - `exceptfds`:异常事件的文件描述符集合。 - `timeout`:超时时间,如果设置为 NULL,则阻塞直到有事件发生;如果设置为零,立即返回;如果设置为一个指定时间,超过该时间还没有事件发生,则返回。 `select` 函数的工作原理是将进程阻塞,直到监视的文件描述符集合中的任意一个文件描述符就绪(可读、可写或出现异常),或者超过指定的超时时间。 使用 `select` 函数进行多路 I/O 复用的一般步骤如下: 1. 创建并初始化文件描述符集合。 2. 将需要监视的文件描述符添加到相应的集合中。 3. 调用 `select` 函数进行阻塞等待。 4. 检查哪些文件描述符已经就绪。 5. 处理就绪的文件描述符。 需要注意的是,`select` 函数在每次调用时都会修改传入的文件描述符集合,因此在每次调用前需要重新初始化。 除了 `select`,还有其他的多路 I/O 复用函数,如 `poll` 和 `epoll`,它们在不同的操作系统中有不同的实现方式和特性,可以根据具体需求选择合适的函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值