如果一个或多个I/O条件满足,我们可以被通知到。
场合:
1. 当客户处理多个描述字时
2. 一个客户同时处理多个套接口
3. 一个tcp服务器既要处理监听套接口,又要处理已连接的套接口
4. 一个服务器既要处理tcp, 又要处理UDP
5. 一个服务器要处理多个服务或者多个协议
I/O模型:
l 阻塞
l 非阻塞
l 信号驱动
l 异步
l I/O复用
<sys/select.h> <sys/time.h>
int select( int maxfdp, fd_set *readset, fd_set *writeset, fd_set * exceptset, const struct timeval *timeout); 返回准备好描述字的整数,0超时,-1出错 |
struct timeval{
long tv_sec; // seconds
long tv_usec; //microseconds
}
当timeout为空时可能永远等待下去
当他为0时,不等待
void FD_ZERO( fd_set *fdset);
void FD_SET(int fd, fd_set *fdset);
void FD_CLR(int fd, fd_set * fdset);
int FD_ISSET(int fd, fd_set *fdset);
<stdio.h>
int fileno( FILE *stream);返回文件流使用的文件描述符
接受和发送低潮限度目的:在select返回可读或可写条件之前,应用进程可以对多少数据可读或多大空间可写进行控制。
批量输入:当发送多个请求后,客户端关闭,但有一些请求在去往服务器的路上,如果这时关闭则不能读取到服务器返回的数据,需要半关闭。即客户端发送一个FIN通知服务器端我数据发送完毕,但仍为读放开套接口描述字。需要函数shutdown
<sys/socket.h>
int shutdown( int sockfd, int howto) 0成功,-1出错 |
hwoto取值: SHUT_RD 关闭连接的读这一半,不接受套接口数据,且现留在套接口缓冲区数据作废 SHUT_WR 关闭连接写这一半,半关闭,缓冲区数据都被发送,。 SHUT_RDWR 等效于调用shutdown两次,调用_RD,和_WR |
<sys/select.h> <signal.h> <time.h>
int pselect( int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset, const struct timespec *timeout, const sygset_t *sigmask) |
struct timespec{
time_t tv_sec; //seconds
long tv_nsec; //nanoseconds
}
自己练习了一下: