May 26

如果需要同时从多个文件, 多个网络连接中读取数据, 除了使用多线程, 使用IO多路复用接口也是常用, 有时是更有效的方法.

最常用的IO多路复用接口是select, epoll, kqueue, signal. 但是, 这些接口除了性能各不相同, 连API也各不相同. 为了避免程序和IO多路复用接口绑定, 所以需要封装一层. 我参考了select, epoll这两种接口, 还参考了lighttpd对这些接口的封装, 并最终开发了一套封装接口.

首先看select:

数据结构: fd_set
初始化: FD_ZERO
注册: FD_SET
等待信号: select

再看epoll:

数据结构: epoll_event
初始化: epoll_create
注册: epoll_ctl
等待信号: epoll_wait

封装的接口如下:

/* 创建IO复用接口 */
struct fdevents *fdevents_init(int max_fds);

/* 添加文件描述符要监听的事件. */
int fdevents_add(struct fdevents *evs, struct fdevent *ev);

/* 删除文件描述符要监听的事件. */
int fdevents_del(struct fdevents *evs, struct fdevent *ev);

/* 修改文件描述符要监听的事件. */
int fdevents_mod(struct fdevents *evs, struct fdevent *ev);

/* 类似 FD_SET, 但fd在调用前必须已经被监听 */
int fdevents_set(struct fdevents *evs, int fd, int flags);

/* 类似 FD_CLR, 但fd在调用前必须已经被监听 */
int fdevents_clr(struct fdevents *evs, int fd, int flags);

/*
等待监听队列监听的事件, 返回就绪的文件描述符数目.
就绪的信号放在fdevents.ready_events数组中.
*/
int fdevents_wait(struct fdevents *evs, int timeout_ms);

相关阅读: The C10K problem

Related posts:

  1. 网络传输层封装
  2. C语言网络程序惯用法-参数传递
  3. sunrpc 函数功能分析
  4. 一种网络通讯二进制数据格式
  5. RPC程序的一般结构 – nfsd

Written by benegg at 2009-05-26 16:15:37 | Views: 2990

Leave a Reply

必须登录, 或者浏览器开启JavaScript支持才可以评论!