首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux select poll源码剖析

在读select、poll源码前,需要先了解的知识点: 等待队列 文件系统(主要是进程的打开文件描述符表以及struct file) poll机制 资源注册监听poll() -> poll_wait(...select()/poll()调用对应一个struct poll_wqueues 一个监听事件对应一个struct poll_table_entry Common poll机制是所有多路转接的共性;调用控制块.../* * Structures and helpers for sys_poll/sys_poll */ struct poll_wqueues { poll_table pt; struct...实际linux内核设计: * 每个wait_queue_t的private字段指向同一个poll_wqueues,然后 * 共用的poll_wqueues中保存了指向调用进程...被封装在了poll_wqueues结构体中,以便之后向资源 * 注册监听的时候,能够用poll_table得到对应的poll_wqueues * * 初始化poll_wqueues

3.1K20
您找到你想要的搜索结果了吗?
是的
没有找到

Linux】高级IO --- 多路转接,select,poll,epoll

而此时走过来一个李四,李四这名少年也很喜欢钓鱼,但李四和张三不一样,李四左口袋装着《Linux高性能服务器编程》,右口袋装着一本《算法导论》,左手拿手机,右手拿了一根鱼竿,李四拿了钓鱼凳坐下之后,李四就开始钓鱼了...在这里额外补充一下,linux命令行中表示输入结束的快捷键是ctrl+d,当此热键被用户按下后,代表0号文件描述符写端关闭,此时读端会读到0,read会返回0值,此时进程除了输出提示信息"read file...,也就是信号对应的处理函数,在执行完handler方法返回时,read系统调用会被中断,read返回-1,同时错误码被设置为EINTR。...虽然说epoll是作了改进的poll,但在接口的使用和底层实现上,epoll和poll天差地别,在linux内核2.5.44版本时,就引入了epoll接口,而现在主流的linux内核版本已经是3点几了。...当数据到达网络设备网卡时,会以硬件中断作为发起点,将中断信号通过中断设备发送到CPU的针脚,接下来CPU会查讯中断向量表,找到中断序号对应的驱动回调方法,在回调方法内部会将数据从硬件设备网卡拷贝到软件OS

18630

一种理解同步异步,阻塞非阻塞,Linux IO 模型,select poll epoll 的方法

Linux的五种IO模型 上一节中对同步/异步,阻塞/非阻塞的描述只能说能够恰好区分它们,如果不是在计算机领域而是生活中,道理也类似。...然而计算机中的某些专业术语又需要放在专门的情景中去看,例如下面将要提到的Linux IO模型,建议理解模型本身,而不是抠同步/异步与阻塞非阻塞的字眼,因为会发现就算是非阻塞模型也有阻塞的部分,同步IO与异步...这个结构被拷贝到内核层, 对所有的fd注册回调函数__pollwait 调用fd的poll方法遍历整个FD_SESIZET所有的fd,检查是不是自己需要监听的,如果监听的fd发生了感兴趣的事(文件读写操作完成或者异常...,参考用户态预先的设置),则poll方法返回一个描述读写操作是否就绪的mask掩码,根据mask掩码给fd_set赋值。...struct poll_list { struct poll_list *next; int len; struct pollfd entries[0]; }; 另外poll使用poll_list

6.8K10

大话 Select、Poll、Epoll

遗憾的是,linux的网络IO中是不存在异步IO的,linux的网络IO处理的第二阶段总是阻塞等待数据copy完成的。真正意义上的网络异步IO是Windows下的IOCP(IO完成端口)模型。...2 Linux的socket 事件wakeup callback机制 言归正传,在介绍select、poll、epoll前,有必要说说linux(2.6+)内核的事件wakeup callback机制,...Linux通过socket睡眠队列来管理所有等待socket的某个事件的process,同时通过wakeup机制来异步唤醒整个睡眠队列上等待事件的process,通知process相关事件发生。...在linux 2.6.8之前的内核,epoll使用hash来组织fds集合,于是在创建epoll fd的时候,epoll需要初始化hash的大小。...在linux 2.6.8以后的内核中,epoll使用红黑树来组织监控的fds集合,于是epoll_create(int size)的参数size实际上已经没有意义了。

24.7K4921

select,poll,epoll区别

select的一个缺点在于单个进程能够监视的文件描述符的数量存在最大限制,在Linux上一般为1024,不过可以通过修改宏定义甚至重新编译内核的方式提升这一限制。...epoll 直到Linux2.6才出现了由内核直接支持的实现方法,那就是epoll,它几乎具备了之前所说的一切优点,被公认为Linux2.6下性能最好的多路I/O就绪通知方法。...在select/poll中,进程只有在调用一定的方法后,内核才对所有监视的文件描述符进行扫描,而epoll事先通过epoll_ctl()来注册一个文件描述符,一旦基于某个文件描述符就绪时,内核会采用类似...实际上,当前版本的Linux会自动修改timeout参数,设置它的值为剩余时间。...4.内核微调     这一点其实不算epoll的优点了,而是整个linux平台的优点。也许你可以怀疑linux平台,但是你无法回避linux平台赋予你微调内核的能力。

1.3K21

使用 poll 检测管道断开

一般使用 poll 检测 socket 或标准输入时,只要指定 POLLIN 标志位,就可以检测是否有数据到达,或者连接断开: 1 struct pollfd fds[3]; 2 fds[0].fd...sock_fd; 5 fds[1].events = POLLIN; 6 fds[2].fd = pipe_fd; 7 fds[2].events = POLLIN; 8 ret = poll...一个已经关闭的句柄时(句柄号 >=0 有效),poll 本身并不返回错误,而是给对应的句柄事件中设置  POLLNVAL 标志位: 1 if (pfd[2].revents & POLLNVAL) {...2 // handle pipe close 3 ... 4 } 若 poll 一个无效句柄时(句柄号为-1),poll 本身仍不返回错误,但该句柄一定没有任何事件可供检测与返回...当然如果传入 poll 的句柄数组中所有句柄都为无效句柄时,poll仍不返回错误,此时若提供超时,可当成sleep使用; 若不提供超时,则会进入无限期等待…… 测试代码

73120
领券