Posts tagged epoll

libev ev_io源码分析

6

最近用libev做项目,在使用libev时遇到了一些问题,最近看了libev的代码,整理了一部分libev实现。

1. ev_watcher和ev_loop

ev_watcher:

libev中所有事件的基础类型ev_watcher,所有的事件都可以通过(W)watcher转换成ev_watcher,大写的W在libev定义的是ev_watcher *。抽象出ev_watcher作用是所有的watcher都可以共用ev_start、ev_stop函数
(更多…)

linux异步IO编程实例分析

4

在Direct IO模式下,异步是非常有必要的(因为绕过了pagecache,直接和磁盘交互)。linux Native AIO正是基于这种场景设计的,具体的介绍见:KernelAsynchronousI/O (AIO) SupportforLinux。下面我们就来分析一下AIO编程的相关知识。

       阻塞模式下的IO过程如下:
(更多…)

夸父驱动造成内核panic的解决手记

4

夸父研发中的共享内存消息传递机制,需要做一个文件系统(姑且叫它“蝗虫文件系统“),在进程退出时会自动删除它打开的文件。另外此文件还支持poll(我自己做的,一般的文件系统不支持),支持poll当然需要等待队列,所以我把一个等待队列放在文件对应的struct inode里,实现该文件struct file_operations里的flush方法,在flush时删除文件并释放该等待队列(kfree)。

这样做似乎一切顺利,直到应用程序开始使用epoll:先在蝗虫文件系统里创建几个文件,再把它们的fd放入epoll(epoll_ctl),然后进程退出,如此多来几次,内核就panic了。还好我用的是QEMU,可以清楚看见在什么地方panic的,结果是 __fput –> eventpoll_release –> eventpoll_release_file –> ep_remove –
(更多…)
Go to Top