int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
struct timeval {
long tv_sec; /* seconds */
long tv_usec; /* microseconds */
};
nfds
最大文件描述符+1
通过告诉内核最多需要检查的文件描述符数量,以提高效率,(否则内核需要检查所有的文件描述符)
至于为什么是最大文件描述符值+1,表示 需要检查的文件描述符的数量,原因是 文件描述符从0开始,而数量从1 开始。
readfds, writefds, exceptfds
都是传入传出参数
通过位掩码的方式表示监听的文件描述符
void FD_CLR(int fd, fd_set *set); int FD_ISSET(int fd, fd_set *set); void FD_SET(int fd, fd_set *set); void FD_ZERO(fd_set *set);
timeout
可以选择:
一直阻塞,直到有事件触发
阻塞一段时间,直到有事件触发
不阻塞,立即返回
阻塞可能被信号处理中断,而timeout不是传出参数,所以timeout不会记录剩余的等待时间,而是使用上次的值调用。
如果需要剩余的等待时间,可以在select调用前后记录系统时间以计算。
原文地址:https://www.cnblogs.com/yangxinrui/p/12393875.html
时间: 2024-10-15 00:33:55