1.文件fd
文件描述符对应的底层是文件,打开文件需要在进程中打开,所以进程结构体也就是PCB(task_struct)里面有一个管理这个进程打开的文件描述符的结构体指针, struct files_struct *files;
接下来看files_struct这个结构体,里面有两个表,一个静态数组,可存放64个文件描述符,也就是最大打开64个文件。还有一个动态数组,如果打开文件描述符超过64个,则用动态数组。
打开文件返回的fd就是数组的索引,数组存放的元素是指针,指向最终文件的结构体files;
files里面有path,inode等字段,对应的就是最终的文件。
思考:同一个files结构体可以被多个进程的数组指针指向,也就是可以被多个进程打开,这种情况一般出现在父子进程fork时。同一个进程时多个fd可以指向同一个文件,也就是用dup或者dup2函数实现。
语法:C如何实现多态,比如把a结构体转为b结构体,做法:b结构体含有一个a结构体,获取a的地址,减去地址偏移量得到b的地址。
2.epoll
epoll高效的关键:内部使用红黑树,增删改查效率再logn ;使用就绪列表,只返回就绪的文件描述符。
哪些文件描述符能用epoll:socket,eventfd,timerfd ;(ext4的文件系统那些不行,因为一直可读可写,监听没意义)
Linux fd 系列 — eventfd 是什么?_煎鱼(EDDYCJY)的博客-CSDN博客 讲eventfd的博客
1.eventfd实现了read/write接口,本质是一个计数器
2.实现了poll和epoll接口,因为轻量,只是一个计数器.所以用于事件的通知管理
3.eventfd监听可读事件才有意义,因为eventfd是一直可写的
4.主要用于结合业务,作为事件的通知机制