epoll()是由epoll_create()、epoll_ctl()、epoll_wait()三个系统调用实现。
epoll_create()
epoll_create()调用内核函数sys_epoll_create(),在参数检查后,sys_epoll_create()中,最为重要的两个内核函数为ep_getfd()、ep_file_init();
1.在 ep_getfd()中为epoll事件分配file、inode、以及文件描述符fd;
file = get_empty_filp();
//在该函数中初始化一系列文件结构以及参数检查
//f = kmem_cache_alloc(filp_cachep, GFP_KERNEL);//分配空间
//eventpoll_init_file(f);
inode = ep_eventpoll_inode();
//分配节点空间以及初始化
//struct inode *inode = new_inode(eventpoll_mnt->mnt_sb);
error = get_unused_fd();
//分配文件描述符fd
fd = error;
2.分配dentry结构体的空间并利用中间结构体qstr将其初始化,将file结构体初始化,并将当前进程与file、dentry、inode联系在一起;
sprintf(name, "[%lu]", inode->i_ino);
this.name = name;
this.len = strlen(name);
this.hash = inode->i_ino;
//通过中间结构体将inode与dentry联系在一起
dentry = d_alloc(eventpoll_mnt->mnt_sb->s_root, &this);
dentry->d_op = &eventpollfs_dentry_operations;
d_add(dentry, inode);
//初始化file结构体
file->f_vfsmnt = mntget(eventpoll_mnt);
file->f_dentry = dentry;
//file与dentry联系在一起
file->f_mapping = inode->i_mapping;
file