下面是
#include <sys/select.h> int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
nfds : 需要检查的文件描述符的数量,通常设置为待监视的最大文件描述符加 1。readfds : 用于监视是否有数据可读的文件描述符集合。writefds : 用于监视是否可以写入数据的文件描述符集合。exceptfds : 用于监视是否有异常情况的文件描述符集合。timeout : 设置超时时间,如果为NULL ,select 将一直等待直到有事件发生。
- 程序调用
select 函数,并传递需要监视的文件描述符集合。 - 内核检查这些文件描述符,看是否有可读、可写或异常情况。
- 如果有事件发生,
select 返回一个大于 0 的整数,表示发生事件的文件描述符的数量。 - 如果超时,
select 返回 0。 - 如果发生错误,
select 返回 -1,并设置errno 。
在文件描述符集合中,
下面是一个简单的使用
#include <stdio.h> #include <stdlib.h> #include <sys/time.h> #include <sys/types.h> #include <unistd.h> int main() { fd_set readfds; FD_ZERO(&readfds); FD_SET(STDIN_FILENO, &readfds); // 监视标准输入 struct timeval timeout; timeout.tv_sec = 5; timeout.tv_usec = 0; int result = select(STDIN_FILENO + 1, &readfds, NULL, NULL, &timeout); if (result > 0) { if (FD_ISSET(STDIN_FILENO, &readfds)) { // 标准输入有数据可读 char buffer[256]; fgets(buffer, sizeof(buffer), stdin); printf("Input: %s", buffer); } } else if (result == 0) { // 超时 printf("Timeout "); } else { perror("select"); exit(EXIT_FAILURE); } return 0; }
这个示例中,程序监视标准输入是否有数据可读,如果在 5 秒内有输入,就会读取并打印输入内容;如果超时,输出 “Timeout”;如果发生错误,输出错误信息。