MST

星途 面试题库

面试题:C语言中如何检查Linux文件描述符是否处于可读状态

在Linux环境下使用C语言编程,给定一个文件描述符fd,说明如何通过系统调用检查它当前是否处于可读状态,并编写相应代码示例。
28.5万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试

在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;
}

代码说明:

  1. 包含头文件

    • stdio.h:提供标准输入输出函数。
    • stdlib.h:提供标准库函数,如exit
    • unistd.h:提供POSIX操作系统API函数,如readwrite
    • sys/types.h:提供基本系统数据类型的定义。
    • sys/select.h:提供select函数和相关数据结构的定义。
  2. 初始化文件描述符集合

    • fd_set read_fds:定义一个文件描述符集合,用于存储要检查的文件描述符。
    • FD_ZERO(&read_fds):清空文件描述符集合。
    • FD_SET(fd, &read_fds):将文件描述符fd添加到文件描述符集合read_fds中。
  3. 设置超时时间

    • struct timeval timeout:定义一个时间结构体,用于设置select的超时时间。
    • timeout.tv_sec = 0:秒数设置为0。
    • timeout.tv_usec = 0:微秒数设置为0,即不等待,立即返回。
  4. 调用select函数

    • int result = select(fd + 1, &read_fds, NULL, NULL, &timeout)
      • 第一个参数fd + 1:要检查的文件描述符集合中最大文件描述符的值加1。
      • 第二个参数&read_fds:指向要检查可读性的文件描述符集合。
      • 第三个参数NULL:不检查可写性,设置为NULL
      • 第四个参数NULL:不检查异常,设置为NULL
      • 第五个参数&timeout:指向超时时间结构体。
  5. 检查返回值

    • result == -1:表示select调用出错,使用perror打印错误信息并退出程序。
    • result:大于0表示有文件描述符变为可读,打印相应信息。
    • result == 0:表示没有文件描述符变为可读,打印相应信息。