MST

星途 面试题库

面试题:C语言中如何在Linux环境下实现简单的非阻塞I/O

请描述在Linux系统下,使用C语言实现非阻塞I/O的基本步骤,并且编写一段简单代码示例,实现对一个文件描述符设置为非阻塞模式,然后进行简单的读操作并处理可能出现的EAGAIN错误。
49.7万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
  1. 基本步骤
    • 使用fcntl函数获取文件描述符的当前标志。
    • 使用fcntl函数设置文件描述符为非阻塞模式,通过在当前标志上添加O_NONBLOCK标志。
    • 进行I/O操作(如读或写),并检查返回值和错误码。如果返回值为 -1 且errnoEAGAIN(或EWOULDBLOCK,不同系统可能有别名),表示资源暂时不可用,需要稍后重试。
  2. 代码示例
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

#define BUFFER_SIZE 1024

int main() {
    int fd;
    char buffer[BUFFER_SIZE];
    // 假设文件名为test.txt,打开文件
    fd = open("test.txt", O_RDONLY);
    if (fd == -1) {
        perror("open");
        return 1;
    }
    // 获取当前文件描述符标志
    int flags = fcntl(fd, F_GETFL, 0);
    if (flags == -1) {
        perror("fcntl F_GETFL");
        close(fd);
        return 1;
    }
    // 设置为非阻塞模式
    if (fcntl(fd, F_SETFL, flags | O_NONBLOCK) == -1) {
        perror("fcntl F_SETFL");
        close(fd);
        return 1;
    }
    // 进行读操作
    ssize_t bytes_read = read(fd, buffer, sizeof(buffer));
    if (bytes_read == -1) {
        if (errno == EAGAIN || errno == EWOULDBLOCK) {
            printf("资源暂时不可用,稍后重试\n");
        } else {
            perror("read");
        }
    } else {
        buffer[bytes_read] = '\0';
        printf("读取到的数据: %s\n", buffer);
    }
    close(fd);
    return 0;
}