随笔分类 -  libev

摘要:在Libev中,如果某种结构的数组需要扩容,它使用array_needsize宏进行处理,比如:array_needsize (int, fdchanges, fdchangemax, fdchangecnt, EMPTY2); 这就表示要将整型(int)数组fdc... 阅读全文
posted @ 2015-11-15 09:51 gqtc 阅读(411) 评论(0) 推荐(0) 编辑
摘要:Libev中的信号监视器,用于监控信号的发生,因信号是异步的,所以Libev的处理方式是尽量的将异步信号同步化。异步信号的同步化方法主要有:signalfd、eventfd、pipe、sigwaitinfo等。这里Libev采用的是前三种方法,最终都是将对异步信号的处理,转化成对文... 阅读全文
posted @ 2015-11-08 09:32 gqtc 阅读(920) 评论(0) 推荐(0) 编辑
摘要:#include int eventfd(unsigned int initval, int flags); eventfd创建一个eventfd对象,该对象可用于用户空间的程序实现事件等待、通知机制,也可用于由内核向用户空间的应用进行事件的通知。eventfd对象在内核中包含了一个计... 阅读全文
posted @ 2015-11-06 22:44 gqtc 阅读(525) 评论(0) 推荐(1) 编辑
摘要:一:信号简述 信号是典型的异步事件。内核在某个信号出现时有三种处理方式:a:忽略信号,除了SIGKILL和SIGSTOP信号不能忽略外,其他大部分信号都可以被忽略;b:捕捉信号,也就是在信号发生时调用一个用户函数,注意不能捕捉SIGKILL和SIGSTOP;c:执行系统默认动作,注意... 阅读全文
posted @ 2015-11-06 21:37 gqtc 阅读(1685) 评论(0) 推荐(1) 编辑
摘要:Libev中的超时监视器ev_periodic,是绝对时间定时器,不同于ev_timer,它是基于日历时间的。比如如果指定一个ev_periodic在10秒之后触发(ev_now() + 10),然后将系统时间调整为去年的一月一号,则该定时器会在一年后才触发超时事件。(ev_time... 阅读全文
posted @ 2015-10-31 11:30 gqtc 阅读(1104) 评论(0) 推荐(0) 编辑
摘要:Libev中的超时监视器ev_timer,就是简单的相对时间定时器,它会在给定的时间点触发超时事件,还可以在固定的时间间隔之后再次触发超时事件。 所谓的相对时间,指的是如果你注册了一个1小时的超时事件,然后调整系统时间到了去年的一月份,该超时事件依然会在1个小时之后... 阅读全文
posted @ 2015-10-25 11:05 gqtc 阅读(1057) 评论(0) 推荐(0) 编辑
摘要:一:代码流程 在Libev中,启动一个IO监视器,等待该监视器上的事件触发,然后调用该监视器的回调函数。整个的流程是这样的: 首先调用ev_default_loop初始化struct ev_loop结构; 然后调用ev_io_init初始化监视器中的属性,... 阅读全文
posted @ 2015-10-25 10:27 gqtc 阅读(800) 评论(0) 推荐(0) 编辑
摘要:Libev中在管理定时器时,使用了堆这种结构,而且除了常见的最小2叉堆之外,它还实现了更高效的4叉堆。 之所以要实现4叉堆,是因为普通2叉堆的缓存效率较低,所谓缓存效率低,也就是说对CPU缓存的利用率比较低,说白了,就是违背了局部性原理。这是因为在2叉堆中,对元素的... 阅读全文
posted @ 2015-10-17 13:15 gqtc 阅读(357) 评论(0) 推荐(0) 编辑
摘要:在Libev中,使用poll作为backend时,涉及到下面几种数据结构:int *pollidxs;int pollidxmax;struct pollfd *polls;int pollmax;int pollcnt; polls就是struct pollfd结... 阅读全文
posted @ 2015-10-11 13:37 gqtc 阅读(361) 评论(0) 推荐(0) 编辑
摘要:使用epoll时,如果在调用epoll_create之后,调用了fork创建子进程,那么父子进程虽然有各自epoll实例的副本,但是在内核中,它们引用的是同一个实例。子进程向自己的epoll实例添加、修改和删除文件描述符时,是可以影响到父进程的epoll_wait的。所以会发生意想... 阅读全文
posted @ 2015-09-28 22:22 gqtc 阅读(614) 评论(0) 推荐(0) 编辑
摘要:在Libev的源码中,用到了一种用C实现类似C++中继承的技巧,主要是用宏和结构体实现。 在Libev中,最关键的数据结构就是各种监视器,比如IO监视器,信号监视器等等。这些监视器的多数成员都是一样的,只有少部分成员为各自独有。这就非常类似于C++中继承的使用场景了... 阅读全文
posted @ 2015-09-13 17:11 gqtc 阅读(364) 评论(0) 推荐(0) 编辑
摘要:众所周知,Linux下的多路复用函数select采用描述符集表示处理的描述符。描述符集的大小就是它所能处理的最大描述符限制。通常情况下该值为1024,等同于每个进程所能打开的描述符个数。 增大描述符集大小的唯一方法是先增大FD_SETSIZE的值,然后重新编译内核,不重... 阅读全文
posted @ 2015-08-27 22:24 gqtc 阅读(791) 评论(0) 推荐(0) 编辑