linux网络编程之IO复用

本文介绍了Linux下三种主要的IO复用技术:select、poll和epoll。详细讲解了各自的API使用方法,包括参数含义及功能特点,并对比了三者之间的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

IO复用技术在编写网络程序经常需要用到,对他的需求可分为多种情况,具体就不讨论了。linux下实现IO复用主要有三种系统调用:select、poll和epoll。

1、select API

<sys/select.h>

int select (int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout)

nfds参数指定被监听文件描述符的总数。后面三个参数分别指向可读、可写和异常等事件对应的文件描述符集合,timeout参数用来设置select函数超时时间。

2、poll API

<poll.h>

int poll(struct pollfd *fds, nfds_t nfds, int timeout)

fds参数是一个pollfd结构类型的结构体,他指定感兴趣的文件描述符上放生的可读、可写和异常等事件。

struct pollfd

{

int fd;                                 //文件描述符

short events;                   // 注册事件

short revents;                 //实际发生的事件,由内核填充

}

nfds参数指定被监听时间集合fds的大小。

timeout参数指定poll的超时时间。

3、epoll API

epoll是Linux特有的IO复用函数,epoll使用一组函数来完成任务,而不是单个函数。epoll把用户关心的文件描述符上的事件放在内核的一个事件表中,不像select和poll每次调用都要重复传入文件描述符集或事件集。epoll使用一个额外的文件描述符来唯一标示内核中的这个事件表。该文件描述符用如下函数创建:

<sys/epoll.h>

int epoll_create(int size)

该函数返回的文件描述符将用作其他所有epoll系统调用的第一个参数,一指定所访问的内核事件表。下面函数用来操作epoll的内核事件表:

<sys/epoll.h>

int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event)

fd指定要操作的文件描述符,op指定操作类型(注册、修改和删除),event指定事件。

epoll_wait函数,在一段超时时间内等待一组文件描述符上的事件,原型如下:

<sys/epoll.h>

int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout)

该函数成功返回时返回就绪文件描述符的个数。timeout为超时时间。maxevents为最多监听多少个事件。events数组存放是是就绪的事件,而不像select和poll的数组参数那样既用于传入用户注册事件,有用于输出内核检测的就绪事件。这就大大提高了应用程序索引就绪文件描述符的效率。

4、它们的区别





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值