一、I/O模型分类
- 阻塞I/O模型;
- 非阻塞I/O模型;
- I/O复用(select 和 poll)模型;
- 信号驱动I/O模型;
- 异步I/O(POSIX的aio_系列函数)模型。
其中阻塞I/O模型、非阻塞I/O模型、 I/O复用(select 和 poll)模型、信号驱动I/O模型都是同步I/O操作、只有异步I/O模型才是异步操作。
同步I/O操作指:导致请求进程阻塞,直到I/O操作完成;
异步I/O操作指:不导致请求进程阻塞。
二、相关函数
函数 | 描述 |
---|---|
int select (int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, const struct timeval *timeout); | 位于:<sys/select.h>; 功能:该函数允许进程指示内核等待多个事件中的任何一个发生,并只在一个或多个事件发生或经历一段指定的时间后才唤醒它。也就是说,我们调用select告知内核对那些描述符(就读、写或异常条件)感兴趣已经等待多长时间。我们感兴趣的描述符不局限于套接字,任何描述符都可以使用select; 返回:若有就绪描述符则为其数目,若超时则为0,若出错则为-1。 |
int pselect(int maxfdp1, fd_set *readset, fd_set *writeset, fd_Set *exceptset, const struct timespec *timeout, const sigset_t *sigmask); | 位于:<sys/select.h>; 功能:类似于select,但比select更灵活; 返回:若有就绪描述符则为其数目,若超时则为0,若出错则为-1。 |
int poll(struct pollfd *fdarray, unsigned long nfds, int timeout); | 位于:<pool.h>; 功能:类似于select,但是在处理流设备时提供了额外信息; 返回:若有就绪描述符则为其数目,若超时则为0,若出错则为-1。 |