Linux中epoll()函数的底层实现

本文详细介绍了Linux中epoll的实现机制,包括epoll_create()、epoll_ctl()和epoll_wait()三个关键函数的工作原理。epoll_create()在内核中分配资源,epoll_ctl()用于事件的增删改,而epoll_wait()则负责事件的等待和通知。在epoll_wait()的实现中,ep_poll()函数通过检查rdllist来决定是否唤醒等待进程。博客作者欢迎读者提供反馈和指正。
摘要由CSDN通过智能技术生成

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值