IO复用

#【I/O复用】
##-------------select-------------

#include <sys/select.h>
int select(nfds,		//被监听的文件描述符的总数(最大文件描述符+1,因为文件描述符从0开始)
	fd_set* readfds,	//可读文件描述符的集合
	fd_set* writefds,
	fd_set* exceptfds,
	struct timeval* timeout)
typedef struct{
	long int bit_sets[1024/8/sizeof(long int)];
}fd_set;
struct timeval{
	long tv_sec;
	long tv_usec;
};
timeout = 0 则非阻塞
timeout = NULL 则阻塞
返回0 则在timeout时间内没有文件描述符就绪
返回-1 表示失败并设置errno
	当被信号打断是设置errno=EINTR
返回>0 表示就绪的文件描述符
FD_ZERO(fd_set* fdset);
FD_SET(int fd,fd_set* fdset);
FD_CLR(int fd,fd_set* fdset);
FD_ISSET(int fd, fd_set* fdset);

##-------------poll-------------

#include <sys.poll.h>
int poll(struct pollfd* fds,	//结构体数组首地址
	nfds_t nfds,		//数组大小
	int timeout)		//等待超时毫秒

struct pollfd{
	int fd;		//注册的文件描述符
	short events;	//关注的事件
	short revents;	//返回的事件,由内核填充
}typedef unsigned long int nfds_t;
返回值同select

##-------------epoll-------------

epoll与select、poll不相同,他是liunx独有的,epoll把用户关心的事件集放入内核的事件表中,select需要每次传入文件描述符集、poll需要每次传入事件集,因此epoll比select、poll方便,但需要一个额外的文件描述符唯一的标识内核的事件表
#include <sys/epoll.h>
int epoll_create(int size);//size不起作用
返回文件描述符
int epoll_ctl(int epfd,		//内核事件表的文件描述符
	int op,			//对fd的操作
	int fd,			//
	struct epoll_event* event)//指定事件
op:	EPOLL_CTL_ADD
	EPOLL_CTL_MOD
	EPOLL_CTL_DEL
struct epoll_event{
	__uint32_t events;	//epoll事件
	epoll_data_t data;	//用户数据
};
struct union epoll_data{
	void* ptr;
	int fd;
	uint32_t u32;
	uint64_t u64;
}epoll_data_t;

int epoll_wait(int epfd,
		struct epoll_event* events,	//输出事件数组
		int maxevents,			//监听的事件个数
		int timeout)
返回就绪事件的个数,将就绪事件的从内核的事件描述表中复制到events中
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux IO复用是指在处理多个I/O事件时,通过一种机制使得一个进程可以同时监听多个I/O操作,从而提高程序的效率和性能。 在Linux系统中,常用的IO复用机制有三种:select、poll和epoll。 1. select:select函数是最早引入的IO复用机制之一,它通过传入一组文件描述符集合,来监听这些文件描述符上是否有事件发生。当其中任意一个文件描述符上有事件发生时,select函数就会返回,然后程序可以通过遍历文件描述符集合来判断哪些文件描述符上有事件发生。 2. poll:poll函数是对select的改进,其使用方式和select类似。不同的是,poll函数使用一个pollfd结构数组来存储待监听的文件描述符及其对应的感兴趣事件,通过调用poll函数时传入这个数组来实现IO复用。相对于select,poll没有最大文件描述符数量的限制,并且效率更高。 3. epoll:epoll是Linux下最新的IO复用机制,它提供了更加高效的IO事件通知机制。epoll使用一个文件描述符来管理被监听的其他文件描述符,通过调用epoll_ctl函数向这个文件描述符中注册或者删除需要监听的文件描述符。当某个文件描述符上有事件发生时,epoll_wait函数会返回该文件描述符的相关信息给程序处理。相对于select和poll,epoll在处理大量连接时具有更好的性能。 总结来说,Linux IO复用机制可以让一个进程同时监听多个I/O事件,避免了使用阻塞IO时的等待时间,提高了程序的效率和性能。而select、poll和epoll是常用的IO复用机制。其中,epoll是效率最高的一种机制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值