epoll源码分析(二)
epoll_ctl() 函数实现
struct ep_pqueue
{
poll_table pt;
struct epitem *epi;
};
- 调用
copy_from_user
将数据从用户空间拷贝到内核空间
- 通过
fget()
获得获得epoll_create()创建的匿名文件的文件指针.
- 进行 epoll_ctl() 传入的
op
方法的判断.
SYSCALL_DEFINE4(epoll_create, int, epfd, int, op, int, fd, struct epoll_event __user*, event)
{
struct epoll_event epds;
...
if(ep_op_has_event(op) && copy_from_user(&epds, event, sizeof(struct epoll_event)))
goto error_return;
file = fget(epfd);
if (!file)
goto error_return;
tfile = fget(fd);
if (!tfile)
goto error_fput;
...
epi = ep_find(ep, tfile, fd);
error = -EINVAL;
switch (op)
{
case