事件轮询接口

news/2024/7/9 16:08:33 标签: epoll

epoll使得时间监听器的注册与实际的事件监视工作脱钩,有三种系统调用:

  1. 初始化epoll的上下文;
  2. 将要查看的文件描述符加入上下文(或移除);
  3. 实际执行时间等待。
#include <stdio.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/uio.h>
#include <sys/epoll.h>
#include <memory.h>
#include <stdlib.h>

int main(){
//创建epoll,epfd为可用控制的句柄
int epfd = epoll_create(2);

struct epoll_event event1[2];
struct epoll_event event2[2];

event1[0].events = EPOLLIN;
event1[0].data.fd = STDIN_FILENO;
event1[1].events = EPOLLOUT;
event1[1].data.fd = STDOUT_FILENO;

int ret = epoll_ctl(epfd, EPOLL_CTL_ADD, STDIN_FILENO, &event1[0]);
ret = epoll_ctl(epfd, EPOLL_CTL_ADD, STDOUT_FILENO, &event1[1]);

struct epoll_event* events = (epoll_event*)malloc(sizeof(struct epoll_event)*2);
sleep(2);
int nr_events = epoll_wait(epfd, events, 2, -1);

int i;
for(i = 0; i < nr_events; i++){
printf("event=%d on fd=%d\n", events[i].events, events[i].data.fd);
}
free(events);

close(epfd);
return 0;
}

epoll最简单的程序就是这样吧。

关于ET、LT两种工作模式:

  1. ET模式仅当状态发生变化的时候才得到通知,这里的状态变化并不包括缓冲区还有未处理的数据,也就是即使没有把数据读完还有剩余的,下次wait的时候不会发现这个变化;
  2. LT模式下只要有数据就会一直通知下去。

用下面的程序可以看到这两种模式的区别:

int main(){
int epfd = epoll_create(2);

struct epoll_event event1[2];

event1[0].events = EPOLLIN|EPOLLET;//设置为边缘触发模式
event1[0].data.fd = STDIN_FILENO;

int ret = epoll_ctl(epfd, EPOLL_CTL_ADD, STDIN_FILENO, &event1[0]);

struct epoll_event* events = (epoll_event*)malloc(sizeof(struct epoll_event));

sleep(2);//输入ab
int nr_events = epoll_wait(epfd, events, 1, 10);

char ch;
read(STDIN_FILENO, &ch, 1);//注意这里和scanf的区别
printf("%d %c\n", nr_events, ch);

nr_events = epoll_wait(epfd, events, 1, 10);

read(STDIN_FILENO, &ch, 1);
printf("%d %c\n", nr_events, ch);

free(events);

close(epfd);
return 0;
}

转载于:https://www.cnblogs.com/ggzwtj/archive/2011/10/11/2207222.html


http://www.niftyadmin.cn/n/1262492.html

相关文章

解决办法:Access restriction: The type JPEGImageEncoder is not accessible due to restriction

报错&#xff1a; Access restriction:The type JPEGCodec is not accessible due to restriction on required library C:\Program Files\Java\jre6\lib\rt.jar 解决方法&#xff1a; Project -> Properties -> libraries&#xff0c; 先remove掉JRE System Libr…

什么是商业智能BI和实施BI的解决方案

商业智能&#xff0c;或BI&#xff0c;是一种统称&#xff0c;泛指用于对一个企业的原始数据进行分析的各种各样的软件系统。商业智能&#xff08;BI&#xff09;是由若干相关的活动组成的领域&#xff0c;包括 数据挖掘&#xff0c;在线分析处理&#xff0c;查询和报表。 企业…

关于打印

工作中要用到打印 今天赶紧到BLOG上搜索 拜读了snaill的 “怎样用C#实现完整文档打印功能”,kingerq的“网页打印问题&#xff0c;打印设置&#xff0c;打印预览&#xff0c;打印分页&#xff0c;纵打&#xff0c;横打及页面的边距”等人的文章 下面写点心得体会 一&#xff1a…

操作系统learning

-------2011/10/31 进程 进程是一个具有一定独立功能的程序在一个数据集合上的一次动态执行过程。 作为描述程序执行过程的概念&#xff0c;进程具有动态性、独立性、并发性和结构化等特征。 动态性是指进程具有动态的地址空间&#xff0c;地址空间的大小和内容都是动态变化的。…

围观文件穿越操作

大概这么几个思路1. 打开文件用IoCreateFile&#xff0c;其他比较好发irp的&#xff08;比如删除操作&#xff09;走FSD irp删除文件部分处理了删除正在运行的exe镜像部分&#xff0c;做法是方法是IAT Hook MmFlushImageSection但是这样对于独占文件依旧不能处理&#xff…

xampp中apache启动失效问题 Attempt to reload DynaLoader.pm aborted

xampp中apache启动失效问题 在windows上使用xampp搭建php的开发环境&#xff0c;后来又安装了oracle 10g。你会发现&#xff0c;由于oracle 10g 建立了“perl5lib”的环境变量路径&#xff0c;从而导致xampp启动apache的时候报错&#xff1a;[Thu Oct 22 08:56:27 2009] [erro…

通用短信平台接口

1.注册帐户 我使用的这个接口&#xff0c;是要在他们平台上注册的。平台地址: http://ad.smsadmin.cn/ 注册这个平台账号之后&#xff0c;它们会给你十条短信试用。还是挺人性化的&#xff0c;对于我们来说学到东西又不花钱&#xff0c;哈哈。 平台发送短信都是基于http协议的…

TCP/IP学习笔记:路由与BGP

路由 路由器交换信息的通信量只能占底层网络通信量的一小部分&#xff0c;且必须限制参与交换路由器的数量和报文的大小。 通常的启发式原则是&#xff1a; 最多可以有12个路由器安全的参与广域网上的一个路由信息协议。 最多可以有60个路由器安全的参与一系列局域网上的路由信…