epoll函数
函数epoll
1. 函数epoll_creat: 该函数生成一个epoll专用的文件描述符
int epoll_creae(int size);
分析:
- size:epoll上能关注的最大描述符数
2. epoll_ctl:用于控制某个epoll文件描述符事件,可以注册、修改、删除
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
参数:
1. efd:epoll_create函数的返回值
2. op:对该监听红黑树所做的操作
- EPOLL_CTL_ADD:添加新的fd到epfd中
- EPOLL_CTL_MOD:修改fd在监听红黑树的监听事件
- EPOLL_CTL_DE:将一个fd从监听红黑树摘下
3. fd:待监听的fd
4. event:本质struct epoll_event 结构体地址
typedef union epoll_data
{
void* ptr;
int fd; //对应监听的fd
uint32_t u32;
uint64_t u64;
} epoll_data_t; struct epoll_event
{
uint32_t events; /* epoll事件 */
epoll_data_t data; /* 用户数据 */
};
3. 等待IO事件发生 - 可以设置阻塞的函数
int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);
参数:
- efds:epoll_create函数的返回值
- events:传出参数【数组】满足监听条件的哪些fd结构体
- maxevents:数组元素的总个数(1024) struct epoll_events [1024]:
- timeout:
- ET:边缘触发只有数据到来才触发,不管缓冲区是否还有数据(缓冲区剩余未读尽的数据的数据不会导致epoll_wait返回。新的时间满足,才会触发)
- LT:水平触发 ---默认采用模式(缓冲区剩余未读尽的数据会导致epoll_wait返回。)
1. 测试代码:
#include <errno.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h> #define MAXLINE 10 int main(int argc, char *argv[])
{
int efd, i;
int pfd[];
pid_t pid;
char buf[MAXLINE],ch = 'a';
pipe(pfd);
pid = fork(); if (pid == ) //子写
{
close(pfd[]); //关闭读
while ()
{
for (i = ; i < MAXLINE / ; i++) //aaaa\n
buf[i] = ch;
buf[i - ] = '\n';
ch++; for (; i < MACLINE; i++) //bbbb\n
buf[i] = ch;
buf[i - ] = '\n';
ch++; write(pdf[], buf, sizeof(buf)); //aaaa\nbbbb\n
sleep();
}
close(pfd[]);
}
else if (pid < ) //父进程读
{
struct epoll_event;
struct epoll_event resevent[];
int res, len; close(pfd[]); //关闭写
efd = epoll_create(); //event.events = EPOLLIN | EPOLLET // ET边沿触发
even.events = EPOLLIN; // LT水平触发(默认)
event.data.fd = pfd[];
epoll_ctl(efd, EPOLL_CTL_ADD, pfd[], &event); while ()
{
res = epoll_wait(efd, resevent, , -);
printf("res %d\n", res);
if (resevent[].data.fd == pfd[])
{
len = read(pfd[], buf, MACLINE/);
write(STDOUT_FILENO, buf, len);
}
}
close(pfd[pfd[]);
close(efd);
}
else
{
perror("fork");
exit(-);
}
return ;
}
#include <errno.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h> #define MAXLINE 10 int main(int argc, char *argv[])
{
int efd, i;
int pfd[];
pid_t pid;
char buf[MAXLINE],ch = 'a';
pipe(pfd);
pid = fork(); if (pid == ) //子写
{
close(pfd[]); //关闭读
while ()
{
for (i = ; i < MAXLINE / ; i++) //aaaa\n
buf[i] = ch;
buf[i - ] = '\n';
ch++; for (; i < MACLINE; i++) //bbbb\n
buf[i] = ch;
buf[i - ] = '\n';
ch++; write(pdf[], buf, sizeof(buf)); //aaaa\nbbbb\n
sleep();
}
close(pfd[]);
}
else if (pid < ) //父进程读
{
struct epoll_event;
struct epoll_event resevent[];
int res, len; close(pfd[]); //关闭写
efd = epoll_create(); //event.events = EPOLLIN | EPOLLET // ET边沿触发
even.events = EPOLLIN; // LT水平触发(默认)
event.data.fd = pfd[];
epoll_ctl(efd, EPOLL_CTL_ADD, pfd[], &event); while ()
{
res = epoll_wait(efd, resevent, , -);
printf("res %d\n", res);
if (resevent[].data.fd == pfd[])
{
len = read(pfd[], buf, MACLINE/);
write(STDOUT_FILENO, buf, len);
}
}
close(pfd[pfd[]);
close(efd);
}
else
{
perror("fork");
exit(-);
}
return ;
}
epoll函数的更多相关文章
- UNIX网络编程学习指南--epoll函数
epoll是select/poll的强化版,都是多路复用的函数,epoll有了很大的改进. epoll的功能 1.支持监听大数目的socket描述符 一个进程内,select能打开的fd是有限制的,有 ...
- I/O多路复用——epoll函数
1 select的低效率 select/poll函数效率比较低,主要有以下两个原因: (1)调用select函数后需要对所有文件描述符进行循环查找 (2)每次调用select函数时都需要向该函数传递监 ...
- epoll函数及三种I/O复用函数的对比
epoll函数 #include <sys/epoll.h>int epoll_create(int size)int epoll_ctl(int epfd, int op, int fd ...
- 详解网络编程必会的poll和epoll函数
前言 之前已经介绍过select函数,请参考这篇博客:https://www.cnblogs.com/liudw-0215/p/9661583.html,原理都是类似的,有时间先阅读下那篇博客,以便于 ...
- (转)浅析epoll – epoll函数深入讲解
原文地址:http://www.cppfans.org/1418.html 浅析epoll – epoll函数深入讲解 前一篇大致讲了一下epoll是个什么东西,优点等内容,这篇延续上一篇的内容,主要 ...
- epoll函数与参数总结学习 & errno的线程安全
select/poll被监视的文件描述符数目非常大时要O(n)效率很低:epoll与旧的 select 和 poll 系统调用完成操作所需 O(n) 不同, epoll能在O(1)时间内完成操作,所以 ...
- UNIX环境高级编程——epoll函数使用详解
epoll - I/O event notification facility 在linux的网络编程中,很长的时间都在使用select来做事件触发.在linux新的内核中,有了一种替换它的机制,就是 ...
- Linux-C网络编程之epoll函数
上文中说到假设从100的不同的地方取外卖,那么epoll相当于一部手机,当外卖到达后,送货员能够通知你.从而达到每去必得,少走非常多路. 它是怎样实现这些作用的呢? epoll的功能 epoll是se ...
- epoll 函数解析
本文参考社长的 TinyWebServer 庖丁解牛 epoll 常用API epoll_create 函数 #include <sys/epoll.h> int epoll_create ...
随机推荐
- C++写文件
头文件 ofstream -- 向文件写内容 实现代码 #include <vector> #include <string> #include <fstream> ...
- 使用thrift实现订阅服务和发布服务
使用thrift实现订阅服务和发布服务 服务:订阅服务 market_subscriber 和 发布服务 market_publisher功能:market_subscriber 能够向 market ...
- Redis学习之一 安装
一.简介 定义 Remote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统. Redis是一个开源的使用ANSI C ...
- bzoj 1175: The stairways of Saharna
一道杨氏矩阵的题,萌新初入门,还不是很懂,这篇 blog 讲的超级好(就是看图有点麻烦) 据说这玩意儿可以代替堆和平衡树用,支持插入.删除.查询,跑得还挺快的(慢着,复杂度好像是 n^2 ? 而且空间 ...
- python 基础 列表
1.列表list()方法用于将元组转换为列表,[]组成,中间可以放很多内容,每一项使用逗号隔开,列表中可以放置任何数据类型的数据.注:元组与列表是非常类似的,区别在于元组的元素值不能修改,元组是放括号 ...
- Tornado学习笔记(一) helloword/多进程/启动参数
前言 当你觉得你过得很舒服的时候,你肯定没有在进步.所以我想学习新的东西,然后选择了Tornado.因为我觉得Tornado更匹配目前的我的综合素质. Tornado学习笔记系列主要参考<int ...
- Java、Apache Tomcat下载与安装及环境变量配置
1.Java JDK 与 Apache Tomcat 下载 JDK 下载 Apache Tomcat 下载 2.安装与环境变量配置 关于 JDK 的安装挺简单的,网上教程也挺多,Tomcat 下载免安 ...
- SecureCRT中sqlplus,使用Backspace删除时 ^H^H
平时习惯用Backspace删除输入错误,但是在SecureCRT中使用是,却是: SQL> sele^H^H 网上有几个方法,觉得改SecureCRT的配置最方便.
- Confluence 6 升级你的许可证
如果你修改了你的许可证(例如为你的许可证增加了更多的用户),或者从 Cloud 中整合到你本地,你需要更新你的许可证. 希望更新你的额许可证: 进入 > 基本配置(General Config ...
- Confluence 6 用户目录图例 - 使用 LDAP 授权,在用户第一次登陆时拷贝用户
上面的图:Confluence 连接到一个 LDAP 目录只用作授权,当用户登录 Confluence 的时候,使用 LDAP 授权并且将用户信息同步到本地路服务器上. https://www.cwi ...