- 浏览: 546443 次
- 性别:
- 来自: 珠海
文章分类
最新评论
-
Helkern:
真没法看
告别 Mac OS X 终端默认的丑陋字体 -
enlangs:
liuming 写道很好很强大。楼主有没有研究过LGPL协议和 ...
GPL 与 BSD 授权的区别 -
magicalboy:
lich0079 写道filer'owner 不一定是什么vi ...
如何理解 File's Owner 与 First Responder -
shushanke:
可以指变量,可以指构造方法。
Java 中 this 关键字的使用 -
Zhongwei_leg:
一块可怜的牛皮糖 写道把数据分成256个表,然后对key的前两 ...
sqlite 的数据插入速度问题
调用 kqueue 接口的示例代码
- 博客分类:
- Python
了解一个接口,最好的方式莫过于亲手去测试,所以直接上示例代码:
代码来自 kqueue - NetBSD System Calls Manual
这段代码的主要功能是,监控一个指定文件,并打印出收到的事件消息。(文件由程序的第一个运行参数指定)
monitor.h
#include <sys/types.h> #include <sys/event.h> #include <sys/time.h> #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <fcntl.h> #include <err.h> int main(int argc, char *argv[]) { int fd, kq, nev; struct kevent ev; static const struct timespec tout = { 1, 0 }; if ((fd = open(argv[1], O_RDONLY)) == -1) err(1, "Cannot open `%s'", argv[1]); if ((kq = kqueue()) == -1) err(1, "Cannot create kqueue"); EV_SET(&ev, fd, EVFILT_VNODE, EV_ADD | EV_ENABLE | EV_CLEAR, NOTE_DELETE|NOTE_WRITE|NOTE_EXTEND|NOTE_ATTRIB|NOTE_LINK| NOTE_RENAME|NOTE_REVOKE, 0, 0); if (kevent(kq, &ev, 1, NULL, 0, &tout) == -1) err(1, "kevent"); for (;;) { nev = kevent(kq, NULL, 0, &ev, 1, &tout); if (nev == -1) err(1, "kevent"); if (nev == 0) continue; if (ev.fflags & NOTE_DELETE) { printf("deleted "); ev.fflags &= ~NOTE_DELETE; } if (ev.fflags & NOTE_WRITE) { printf("written "); ev.fflags &= ~NOTE_WRITE; } if (ev.fflags & NOTE_EXTEND) { printf("extended "); ev.fflags &= ~NOTE_EXTEND; } if (ev.fflags & NOTE_ATTRIB) { printf("chmod/chown/utimes "); ev.fflags &= ~NOTE_ATTRIB; } if (ev.fflags & NOTE_LINK) { printf("hardlinked "); ev.fflags &= ~NOTE_LINK; } if (ev.fflags & NOTE_RENAME) { printf("renamed "); ev.fflags &= ~NOTE_RENAME; } if (ev.fflags & NOTE_REVOKE) { printf("revoked "); ev.fflags &= ~NOTE_REVOKE; } printf("\n"); if (ev.fflags) warnx("unknown event 0x%x\n", ev.fflags); } }
编译,并生成一个用于测试的待监控文件, 然后运行程序。
cc monitor.c -o monitor touch zhongwei.log ./monitor zhongwei.log
对该文件进行各种操作,观察输出:
echo "Hello kqueue" >> zhongwei.log # 输出为: # extended # written touch zhongwei.log # 输出为: # chmod/chown/utimes mv zhongwei.log zhongwei2.log # 输出为: # renamed rm zhongwei2.log # 输出为: # deleted hardlinked
监控效果很好,很强大。看一下代码:
struct kevent ev;
在该示例中,结构体 kevent 用来描述待监测文件(例如,对应的 file descriptor, 需要监控的事件)。
struct kevent { uintptr_t ident; /* identifier for this event */ uint32_t filter; /* filter for event */ uint32_t flags; /* action flags for kqueue */ uint32_t fflags; /* filter flag value */ int64_t data; /* filter data value */ intptr_t udata; /* opaque user data identifier */ };
结构体初始化操作呢?原来在这里:
EV_SET(&ev, fd, EVFILT_VNODE, EV_ADD | EV_ENABLE | EV_CLEAR, NOTE_DELETE|NOTE_WRITE|NOTE_EXTEND|NOTE_ATTRIB|NOTE_LINK| NOTE_RENAME|NOTE_REVOKE, 0, 0);
EV_SET 是一个宏定义,用于简化 kevent 结构体的初始化代码。
在 event.h 中可以看到 EV_SET 的定义,这个文件位于 (系统:Mac OS X 10.6.8)
$ find /System/ -name event.h /System//Library/Frameworks/Kernel.framework/Versions/A/Headers/sys/event.h
#define EV_SET(kevp, a, b, c, d, e, f) do { \ struct kevent *__kevp__ = (kevp); \ __kevp__->ident = (a); \ __kevp__->filter = (b); \ __kevp__->flags = (c); \ __kevp__->fflags = (d); \ __kevp__->data = (e); \ __kevp__->udata = (f); \ } while(0)
现在需要仔细看一下,结构体 kevent 各成员的含义 (括号内为示例代码中传入的实际参数):
ident (fd)
事件的标识,通常使用 file descriptor 来标识。
其他值还有 EVFILT_AIO, EVFILT_SIGNAL 等。
filter (EVFILT_VNODE)
指定用来处理该事件的 kernel filter. 通常是系统预定义的 kernel filter.
EVFILT_VNODE 说明要监控一个文件,具体需要监控的事件类型在 fflags 中指定。
flags (EV_ADD | EV_ENABLE | EV_CLEAR)
Actions to perform on the event.
例如:EV_ADD 是将该事件加入 kqueue;
EV_ENABLE 是允许 kevent() 函数返回该事件,当其触发时。
fflags (NOTE_DELETE|NOTE_WRITE|NOTE_EXTEND|NOTE_ATTRIB|NOTE_LINK|NOTE_RENAME|NOTE_REVOKE)
Filter-specific flags.
data (0)
Filter-specific data value.
udata (0)
Opaque user-defined value passed through the kernel unchanged.
详细信息查看 man kqueue 就行。
参考文档:
1。kqueue - NetBSD System Calls Manual
发表评论
-
高亮网页中的嵌入代码
2011-07-27 11:51 2077这里需要用到的程序为: Pygments -- Pyt ... -
sqlite 的数据插入速度问题
2011-07-17 01:24 6890文章转载自 大象笔记 http://www.sunz ... -
Tornado 源码阅读笔记(三)- kqueue
2011-07-09 14:15 2266继续学习并翻译 (Kqueue: A generic and ... -
Tornado 源码阅读笔记(二)
2011-07-06 21:54 1880主要看一下 Kqueue 的原理 翻译自 (Kqueue: ... -
Python 源码推荐
2011-07-06 13:01 0p.p1 {margin: 0.0px 0.0px ... -
Tornado 源码阅读笔记(一)
2011-07-06 00:36 1644先看一下 Tornado 的 ioloop.py ... -
繁杂统计功能的实现方法
2011-07-01 01:27 932将一个繁杂的统计功能写成一个函数,往往又长又乱。单单统计变量的 ... -
Netbeans 7.0 安装 Python 插件的方法
2011-06-10 12:04 2345Netbeans 7.0 默认的 Available plug ... -
字符串按每3个字符分割
2011-04-19 14:37 1243# encoding: utf-8 ''' 有字 ... -
使用 Qt Designer 为 PySide 设计界面
2011-03-05 19:16 2203看了 Ubuntu Unity 的界面很震撼,相当的炫。没想到 ... -
CentOS 上安装 tornado
2010-12-08 15:31 3584CentOS 5.5 + Python2.6 + Tornad ... -
在 GAE 上用 tornado 写的博客网站
2010-12-03 19:58 1211http://tornadowebserver.appspot ... -
Protocol Buffers
2010-11-19 23:01 1020What is it? Protocol Buffers ... -
Python 官网未被屏蔽的下载地址
2010-10-26 20:25 1430要在 CentOS 上安装 python 2.6 , 发现找不 ... -
代码被 pylint 评了 7.67/10 分, 俺表示压力很大
2010-10-23 15:34 1107各种不规范啊: 几百条提示。。。 列出最业余的 ... -
Python 的杀毒模块
2010-10-18 19:56 1566pyClamd is a python interface ... -
Eclipse 每行 79 字符限制的提示线
2010-10-08 16:00 3530Python 的 PEP 8 中建议每行代码不操过 80 个字 ... -
Python 源码阅读 - calendar.py
2010-10-08 10:53 1409Python 中模拟 C 语言枚举类型的方法: can ... -
在 eclipse 中集成 python shell
2010-09-28 16:39 2795严重推荐方法二 方法一: PyConsole 插件 ... -
提高代码可读性的一则小技巧
2010-09-26 12:06 900今天在看 Python SNMP framework 的文档时 ...
相关推荐
赠送源代码:netty-transport-classes-kqueue-4.1.74.Final-sources.jar; 赠送Maven依赖信息文件:netty-transport-classes-kqueue-4.1.74.Final.pom; 包含翻译后的API文档:netty-transport-classes-kqueue-4.1....
赠送源代码:netty-transport-classes-kqueue-4.1.73.Final-sources.jar; 赠送Maven依赖信息文件:netty-transport-classes-kqueue-4.1.73.Final.pom; 包含翻译后的API文档:netty-transport-classes-kqueue-4.1....
赠送源代码:netty-transport-classes-kqueue-4.1.73.Final-sources.jar; 赠送Maven依赖信息文件:netty-transport-classes-kqueue-4.1.73.Final.pom; 包含翻译后的API文档:netty-transport-classes-kqueue-4.1....
mac下使用gmssl连接服务端的方式法,并使用了kQueue的库方法.
bsd kqueue 技术文档,喜欢开发高性能server的人可以看看
赠送源代码:netty-transport-classes-kqueue-4.1.74.Final-sources.jar; 赠送Maven依赖信息文件:netty-transport-classes-kqueue-4.1.74.Final.pom; 包含翻译后的API文档:netty-transport-classes-kqueue-4.1....
java运行依赖jar包
队列 Ruby 上的 kqueue 绑定。 kqueue只能使用 BSD 系统。 (因为必须安装sys/event.h)用法 require 'kqueue'# Inheritance# class Kqueue < IO# # ident: file descriptor identifier for this event# # filter...
aLiLua 是一套基于 epoll/kqueue/Lua 构建的网络服务开发框架 aLiLua 使用 epoll 进行网络/文件IO事件读写,对Lua协程进行调度,其性能高效并且简单 Lua 语言就像 PHP 那么简单容易理解
epoll,kqueue,事件端口和wepoll的便携式接口。 支持平台: :Linux,Android :macOS,iOS,FreeBSD,NetBSD,OpenBSD,DragonFly BSD :illumos,Solaris :Windows 轮询是在单发模式下完成的,这意味着...
libevent 轻量级的开源高性能事件通知库,支持多种 I/O 多路复用技术,内部使用select、epoll、kqueue、IOCP等系统调用管理事件机制。 支持 I/O,定时器和信号等事件,支持注册事件优先级。可用来构建http服务端、...
要解决C10K问题,传统的多线程模式和select模式都不再适用,应采用epoll,kqueue,dev_poll来捕获IO事件.zip
源码详解文章地址 https://blog.csdn.net/yadoufeng/article/details/130443058?spm=1001.2014.3001.5502
httpserver:一种用C ++编写的高性能单线程HTTP服务器,作为学习工具。 使用kqueue进行事件管理,因此仅适用于MacOS * BSD!
应用任何网络框架,从 epoll/kqueue 直接码起的时候尤其如此。即便使用 libevent, libev 这样事件驱动的网络框架去构建你的服务,程序结构依然不会很简单。为何会这样?因 为这类框架提供的都是非阻塞式的、异步的...
源代码下载地址:【***-sources.jar下载地址(官方地址+国内镜像地址).txt】 # 本文件关键字: 中文-英文对照文档,中英对照文档,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,...
源代码下载地址:【***-sources.jar下载地址(官方地址+国内镜像地址).txt】 # 本文件关键字: 中文-英文对照文档,中英对照文档,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,...
libevent是一个事件触发的网络库,适用于windows、linux、bsd等多种平台,内部使用select、epoll、kqueue等系统调用管理事件机制。著名分布式缓存软件memcached也是libevent based,而且libevent在使用上可以做到跨...
编译库代码,编译脚本会判断OS支持哪种类型的事件机制(select、epoll或kqueue),然后条件编译相应代码,供上层使用的接口仍然是保持统一的(否则也不能所谓的跨平台了)。在linux redhat as 4 u 2 上编译相当...
libevent是一个事件触发的网络库,适用于windows、linux、bsd等多种平台,内部使用select、epoll、kqueue等系统调用管理事件机制。著名的用于apache的php缓存库memcached据说也是libevent based,而且libevent在使用...