面试题答案
一键面试在Linux环境下,可以使用select
系统调用来检查文件描述符是否可读。select
函数允许程序监视多个文件描述符,等待其中一个或多个描述符变为可读、可写或有异常发生。
以下是通过select
系统调用检查文件描述符fd
是否可读的代码示例:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/select.h>
int main() {
int fd = STDIN_FILENO; // 示例文件描述符,这里以标准输入为例
fd_set read_fds;
FD_ZERO(&read_fds);
FD_SET(fd, &read_fds);
struct timeval timeout;
timeout.tv_sec = 0;
timeout.tv_usec = 0;
int result = select(fd + 1, &read_fds, NULL, NULL, &timeout);
if (result == -1) {
perror("select error");
exit(EXIT_FAILURE);
} else if (result) {
printf("文件描述符 %d 可读\n", fd);
} else {
printf("文件描述符 %d 不可读\n", fd);
}
return 0;
}
代码说明:
-
包含头文件:
stdio.h
:提供标准输入输出函数。stdlib.h
:提供标准库函数,如exit
。unistd.h
:提供POSIX操作系统API函数,如read
、write
。sys/types.h
:提供基本系统数据类型的定义。sys/select.h
:提供select
函数和相关数据结构的定义。
-
初始化文件描述符集合:
fd_set read_fds
:定义一个文件描述符集合,用于存储要检查的文件描述符。FD_ZERO(&read_fds)
:清空文件描述符集合。FD_SET(fd, &read_fds)
:将文件描述符fd
添加到文件描述符集合read_fds
中。
-
设置超时时间:
struct timeval timeout
:定义一个时间结构体,用于设置select
的超时时间。timeout.tv_sec = 0
:秒数设置为0。timeout.tv_usec = 0
:微秒数设置为0,即不等待,立即返回。
-
调用
select
函数:int result = select(fd + 1, &read_fds, NULL, NULL, &timeout)
:- 第一个参数
fd + 1
:要检查的文件描述符集合中最大文件描述符的值加1。 - 第二个参数
&read_fds
:指向要检查可读性的文件描述符集合。 - 第三个参数
NULL
:不检查可写性,设置为NULL
。 - 第四个参数
NULL
:不检查异常,设置为NULL
。 - 第五个参数
&timeout
:指向超时时间结构体。
- 第一个参数
-
检查返回值:
result == -1
:表示select
调用出错,使用perror
打印错误信息并退出程序。result
:大于0表示有文件描述符变为可读,打印相应信息。result == 0
:表示没有文件描述符变为可读,打印相应信息。