IO多路复用,select、poll、epoll 编程主要步骤
body, table{font-family: 微软雅黑; font-size: 13.5pt}
table{border-collapse: collapse; border: solid gray; border-width: 2px 0 2px 0;}
th{border: 1px solid gray; padding: 4px; background-color: #DDD;}
td{border: 1px solid gray; padding: 4px;}
tr:nth-child(2n){background-color: #f8f8f8;}
|
select
1、int select(int nfds, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds, struct timeval *timeout);
2、void FD_CLR(int fd, fd_set *set);
3、int FD_ISSET(int fd, fd_set *set);
4、void FD_SET(int fd, fd_set *set);
5、void FD_ZERO(fd_set *set);
|
fd_set rdset;
FD_ZERO(&rdset);
FD_SET(fd,&rdset);
while(1)
{
FD_ZERO(&rdset); //每次使用之前都要清空
FD_SET(fd,&rdset); //集合中加入要监听的描述符
... //可以监听多个,但是有上限,1024
int ret = select(MAXFD+1,&rdset,NULL,NULL,NULL); // 第一个参数是最大描述符+1
if(ret>0)
{
if(FD_ISSET(fd,&rdset)) //判断描述符fd是否在rdset集合里面,是就表示有数据可读
{}
}
}
|
|
epoll
1、int epoll_create(int size);
2、int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
3、int epoll_wait(int epfd, struct epoll_event *events,
int maxevents, int timeout);
|
int epfd = epoll_create(1); //创建一个句柄,区别select内部实现,epoll用的链表,参数非0即可
struct epoll_event event,evs[MAXFD]; //第二个数组是epoll_wait的传出参数
event.events = EPOLLIN; //监听描述符可读事件
event.data.fd = fd; //要监听的描述符是fd
epoll_ctl(epfd,EPOLL_CTL_ADD,fd,&event); //注册事件
event.events = EPOLLIN;
event.data.fd = 0; //终端标准输入
epoll_ctl(epfd,EPOLL_CTL_ADD,0,&event);
while(1)
{
int ret = epoll_wait(epfd,evs,NUM+1,-1); //系统中最大能相应NUM个fd,再加上0;
//-1 永久阻塞,知道事件发生
if(ret>0)
{
for(int i=0;i<ret;++i)
{
if(evs[i].events == EPOLLIN && evs[i].data.fd == fd)
{}
}
}
}
event.events == EPOLLIN;
event.data.fd = fd;
epoll_ctl(epfd,EPOLL_CTL_DEL,fd,&events) //删除一个fd
|
|
poll
1、int poll(struct pollfd *fds, nfds_t nfds, int timeout);
int timerfd_create(int clockid, int flags);
int timerfd_settime(int fd, int flags,
const struct itimerspec *new_value,
struct itimerspec *old_value);
int timerfd = timerfd_create(CLOCK_REALTIME,0);
struct itimerspec new_value;
memset(&new_value,0,sizeof(itimerspec));
new_value.it_value.tv_sec = 5; // 设置初始到期时间
new_value.it_interval.tv_sec = 3; // 间隔时间
timerfd_settime(timerfd,0,&new_value,NULL);
struct pollfd ppfd;
ppfd.fd = timerfd;
ppfd.events = POLLIN;
while(1)
{
poll(&ppfd,1,-1); // 永久等待,知道timerfd触发有数据可读
int tmp;
read(timerfd,&tmp,sizeof(int)); // 读走数据,不然定时器异常,一直触发
}
|
int eventfd(unsigned int initval, int flags); // 第一个参数是计数器的初始值,第二个为0
int efd = eventfd(0,0);
if(!fork())
{// 子进程
int data = 1;
write(efd,&data,sizeof(int));
}
else
{// 父进程
struct pollfd ppfd;
ppfd.fd = efd;
ppfd.events = POLLIN;
poll(&ppfd,1,-1); // 永久等待,计数器中写入数据非0的时候可读,等待过程中父进程睡眠(休眠)
int val;
read(efd,&val,sizeof(int)); // 读走数据,计数器自动清0
}
|
IO多路复用,select、poll、epoll 编程主要步骤的更多相关文章
- IO多路复用select/poll/epoll详解以及在Python中的应用
IO multiplexing(IO多路复用) IO多路复用,有些地方称之为event driven IO(事件驱动IO). 它的好处在于单个进程可以处理多个网络IO请求.select/epoll这两 ...
- 转一贴,今天实在写累了,也看累了--【Python异步非阻塞IO多路复用Select/Poll/Epoll使用】
下面这篇,原理理解了, 再结合 这一周来的心得体会,整个框架就差不多了... http://www.haiyun.me/archives/1056.html 有许多封装好的异步非阻塞IO多路复用框架, ...
- Python异步非阻塞IO多路复用Select/Poll/Epoll使用,线程,进程,协程
1.使用select模拟socketserver伪并发处理客户端请求,代码如下: import socket import select sk = socket.socket() sk.bind((' ...
- 最快理解 - IO多路复用:select / poll / epoll 的区别.
目录 第一个解决方案(多线程) 第二个解决方案(select) 第三个解决方案(poll) 最终解决方案(epoll) 客栈遇到的问题 从开始学习编程后,我就想开一个 Hello World 餐厅,由 ...
- python网络编程——IO多路复用select/poll/epoll的使用
转载博客: http://www.haiyun.me/archives/1056.html http://www.cnblogs.com/coser/archive/2012/01/06/231521 ...
- Linux IO多路复用 select/poll/epoll
Select -- synchronius I/O multiplexing select, FS_SET,FD_CLR,FD_ISSET,FD_ZERO #include <sys/time. ...
- Linux 网络编程的5种IO模型:多路复用(select/poll/epoll)
Linux 网络编程的5种IO模型:多路复用(select/poll/epoll) 背景 我们在上一讲 Linux 网络编程的5种IO模型:阻塞IO与非阻塞IO中,对于其中的 阻塞/非阻塞IO 进行了 ...
- 【操作系统】I/O多路复用 select poll epoll
@ 目录 I/O模式 I/O多路复用 select poll epoll 事件触发模式 I/O模式 阻塞I/O 非阻塞I/O I/O多路复用 信号驱动I/O 异步I/O I/O多路复用 I/O 多路复 ...
- I/O多路复用 select poll epoll
I/O多路复用指:通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作. select select最早于1983年出现在4.2BSD中,它通 ...
- 多路复用select poll epoll
I/O 多路复用之select.poll.epoll详解 select,poll,epoll都是IO多路复用的机制.I/O多路复用就是通过一种机制,一个进程可以监视多个描述符,一旦某个描述符就绪(一般 ...
随机推荐
- R基本图形示例及代码(持续收集)
分布图 hist(MetaData$genes, breaks = 100, main = "Gene number distribution", xlab = "Gen ...
- 20181013xlVba成绩报表优化
Public Sub 成绩报表优化() Application.ScreenUpdating = False Application.DisplayAlerts = False Application ...
- hdu-1115 计算几何 求重心 凸多边形 面积
思想是分割成三角形,然后求三角形的重心.那么多边形重心就是若干个三角形的重心带权求中心,可以用质点质心公式. #include <cstdio> #include <iostream ...
- python3—列表
列表是什么 name = ["jim", "lilei", "lucy"] #方括号表示,逗号分隔 print(name) print(na ...
- Stark组件 (一)
Stark组件构建 1.启动所有app下的stark.py文件,的配置实现步骤 1.创建一个Django项目crm,并创建 app1 ,app2, stark 三个app 2.在crm 项目的set ...
- 小程序点击跳转外部链接 微信小程序提示:不支持打开非业务域名怎么办 使用web-view 配置业务域名
小程序点击跳转外部页面 1.index.wxml 添加点击事件 标签可以是小程序支持的 <!-- 邀请好友 --> <cover-image src='/img/invitat ...
- JavaScript 入门笔记
JavaScript 1.JS和DOM的关系 浏览器有渲染html代码的功能,把html源码在内存里形成一个DOM对象,就是文档对象 浏览器内部有一个JS的解释器/执行/引擎,如chrome用v8 ...
- linux系统下pdf操作软件pdftk
二十一.pdf操作软件pdftk pdftk是一个命令行程序,使用计算机终端进行操作. 1.第一步:安装pdftk windows:https://www.pdflabs.com/tools/pdft ...
- Leetcode 1008. 先序遍历构造二叉树
1008. 先序遍历构造二叉树 显示英文描述 我的提交返回竞赛 用户通过次数169 用户尝试次数183 通过次数171 提交次数247 题目难度Medium 返回与给定先序遍历 preorder ...
- Python迭代和列表生成器
使用for循环遍历list和tuple,这种遍历成为迭代 在如C语言中都是通过下标拿到值,for...in这种方式其实是相同的. 在函数的一节,这样说--->‘求和函数sum(),sum(ite ...