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 编程主要步骤的更多相关文章

  1. IO多路复用select/poll/epoll详解以及在Python中的应用

    IO multiplexing(IO多路复用) IO多路复用,有些地方称之为event driven IO(事件驱动IO). 它的好处在于单个进程可以处理多个网络IO请求.select/epoll这两 ...

  2. 转一贴,今天实在写累了,也看累了--【Python异步非阻塞IO多路复用Select/Poll/Epoll使用】

    下面这篇,原理理解了, 再结合 这一周来的心得体会,整个框架就差不多了... http://www.haiyun.me/archives/1056.html 有许多封装好的异步非阻塞IO多路复用框架, ...

  3. Python异步非阻塞IO多路复用Select/Poll/Epoll使用,线程,进程,协程

    1.使用select模拟socketserver伪并发处理客户端请求,代码如下: import socket import select sk = socket.socket() sk.bind((' ...

  4. 最快理解 - IO多路复用:select / poll / epoll 的区别.

    目录 第一个解决方案(多线程) 第二个解决方案(select) 第三个解决方案(poll) 最终解决方案(epoll) 客栈遇到的问题 从开始学习编程后,我就想开一个 Hello World 餐厅,由 ...

  5. python网络编程——IO多路复用select/poll/epoll的使用

    转载博客: http://www.haiyun.me/archives/1056.html http://www.cnblogs.com/coser/archive/2012/01/06/231521 ...

  6. Linux IO多路复用 select/poll/epoll

    Select -- synchronius I/O multiplexing select, FS_SET,FD_CLR,FD_ISSET,FD_ZERO #include <sys/time. ...

  7. Linux 网络编程的5种IO模型:多路复用(select/poll/epoll)

    Linux 网络编程的5种IO模型:多路复用(select/poll/epoll) 背景 我们在上一讲 Linux 网络编程的5种IO模型:阻塞IO与非阻塞IO中,对于其中的 阻塞/非阻塞IO 进行了 ...

  8. 【操作系统】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 多路复 ...

  9. I/O多路复用 select poll epoll

    I/O多路复用指:通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作. select select最早于1983年出现在4.2BSD中,它通 ...

  10. 多路复用select poll epoll

    I/O 多路复用之select.poll.epoll详解 select,poll,epoll都是IO多路复用的机制.I/O多路复用就是通过一种机制,一个进程可以监视多个描述符,一旦某个描述符就绪(一般 ...

随机推荐

  1. Unity中的粒子特效的 RendererQ 排序

    这里接https://www.cnblogs.com/luguoshuai/p/10021660.html 这里介绍两套粒子排序的方法. 首先声明,这两套排序方法均不是本人所写,是在项目开发的过程当中 ...

  2. python 断言大全

    参考链接:https://blog.csdn.net/qq1124794084/article/details/51668672 1. 小数位模糊等于 自动化脚本最重要的是断言,正确设置断言以后才能帮 ...

  3. LeetCode--459--重复的字符串

    问题描述: 给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成.给定的字符串只含有小写英文字母,并且长度不超过10000. 示例 1: 输入: "abab" 输出: T ...

  4. Fiddler抓包配置具体步骤

    如何查看手机连接的无线wifi的IP? 打开手机,选择设置->进入设置页面选择WLAN->进入WLAN管理,点击手机已经连接的路由器->点击进入查看,即可看见IP地址 如何查看自己电 ...

  5. php 常用设计模式demo

    <?php//__get()//__set()当对象中属性不存在时调用该魔术方法//__call()当对象中方法不存在时//__callStatic()静态方法//__string()当对象不能 ...

  6. 正睿 2018 提高组十连测 Day2 T2 B

    题目链接 http://www.zhengruioi.com/contest/84/problem/318 题解写的比较清楚,直接扒过来了. B 算法 1 直接按题意枚举,动态规划或是记忆化搜索. 时 ...

  7. 网络基础之 tcp/ip五层协议 socket

    1 网络通信协议(互联网协议) 1.1 互联网的本质就是一系列的网络协议 1.2 osi七层协议 1.3 tcp/ip五层模型讲解 1.3.1 物理层 1.3.2 数据链路层 1.3.3 网络层 1. ...

  8. Django 的逆向解析url--reverse(转)

    https://www.cnblogs.com/zhenfei/p/6368955.html Django中提供了一个关于URL的映射的解决方案,你可以做两个方向的使用: 1.有客户端的浏览器发起一个 ...

  9. python-flask-session和scoped_session区别

    scoped_session from sqlalchemy.orm import sessionmaker from sqlalchemy import create_engine from sql ...

  10. virtualbox 中centOS在不能ssh

    这个重要跟虚拟机的网络设置有关系.废话不多说. 针对一个网卡的形式.可以如下进行配置 1.网络-- 连接方式还选择“网络地址转换(NAT)” 其他不变,展开高级,设置端口转发  主机IP设为本机IP, ...