深入探究多路复用I/O:select、poll与pselect
1. 多路复用I/O的引入
在处理I/O操作时,非阻塞I/O虽能避免阻塞,但效率不高。原因主要有两点:一是进程需按任意顺序不断发起I/O操作,等待文件描述符就绪,这并非良好的程序设计;二是若程序能在无I/O操作时休眠,仅在文件描述符就绪时唤醒,将大大提高处理器的利用率。
多路复用I/O应运而生,它允许应用程序同时监听多个文件描述符,当其中任何一个就绪时,应用程序会收到通知,且不会阻塞。其工作流程如下:
1. 多路复用I/O:告知哪些文件描述符准备好进行I/O操作。
2. 若无就绪描述符,休眠直至有一个或多个文件描述符就绪。
3. 被唤醒后,检查哪些描述符就绪。
4. 处理所有就绪的文件描述符,且不阻塞。
5. 回到步骤1。
Linux提供了三种多路复用I/O解决方案:select、poll和epoll。下面重点介绍select和poll。
2. select()系统调用
2.1 函数原型与参数
#include <sys/select.h>
int select (int n,
fd_set *readfds,
fd_set *writefds,
fd_set *exceptfds,
struct timeval *timeout);
FD_CLR(int fd, fd_set *set);
FD_ISSET(int fd, fd_set *s
超级会员免费看
订阅专栏 解锁全文
6

被折叠的 条评论
为什么被折叠?



