Linux文件描述符与FILE指针互相转换

2026-10-230
AI 快速预览详细 收起
本文介绍了在Linux中如何将文件描述符转换为FILE指针,以及如何将FILE指针转换为文件描述符。通过使用fdopen函数,可以将文件描述符转换为FILE指针;通过使用fileno函数,可以从FILE指针中获取对应的文件描述符。示例代码展示了具体的转换过程。注意事项包括文件描述符和FILE指针的关联、关闭文件时的处理以及缓冲问题。

目录

1、文件描述符转换为 FILE 指针

2、FILE 指针转换为文件描述符


在Linux中,文件描述符(file descriptor, fd)和FILE指针(也称为文件流指针,FILE pointer)是两种常见的文件操作接口。文件描述符是一个整数,通过系统调用直接操作文件,而FILE指针是通过C标准库函数操作文件。

  • 文件描述符(fd):由操作系统分配的一个整数标识符,用于标识打开的文件。常用的系统调用包括open、read、write、close。
  • FILE 指针:由C标准库管理的文件流指针,通过fopen、fread、fwrite、fclose等库函数操作。

1、文件描述符转换为 FILE 指针

使用fdopen函数可以将一个已经打开的文件描述符转换为FILE指针。

函数原型如下所示:

FILE *fdopen(int fd, const char *mode);
  • 参数:
    • fd:文件描述符。
    • mode:打开模式,与fopen类似,如"r"、"w"、"a"等。
  • 返回值:成功返回指向FILE对象的指针,失败返回NULL。

示例如下:

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
 
int main() {
    // 打开一个文件并获得文件描述符
    int fd = open("example.txt", O_WRONLY | O_CREAT | O_TRUNC, 0644);
    if (fd == -1) {
        perror("Failed to open file");
        return 1;
    }
 
    // 将文件描述符转换为 FILE 指针
    FILE *file = fdopen(fd, "w");
    if (file == NULL) {
        perror("Failed to convert fd to FILE*");
        close(fd);
        return 1;
    }
 
    // 使用 FILE 指针进行写操作
    fprintf(file, "Hello, FILE pointer!\n");
 
    // 关闭 FILE 指针,注意这也会关闭文件描述符
    fclose(file);
 
    return 0;
}

2、FILE 指针转换为文件描述符

使用fileno函数可以从一个FILE指针中获取对应的文件描述符。

函数原型如下所示:

int fileno(FILE *stream);
  • 参数:
    • stream:指向FILE对象的指针。
  • 返回值:返回文件描述符,如果出错返回-1。

示例如下:

#include <stdio.h>
 
int main() {
    // 打开一个文件并获得 FILE 指针
    FILE *file = fopen("example.txt", "w");
    if (file == NULL) {
        perror("Failed to open file");
        return 1;
    }
 
    // 从 FILE 指针中获取文件描述符
    int fd = fileno(file);
    if (fd == -1) {
        perror("Failed to convert FILE* to fd");
        fclose(file);
        return 1;
    }
 
    // 使用文件描述符进行写操作
    const char *text = "Hello, file descriptor!\n";
    if (write(fd, text, strlen(text)) == -1) {
        perror("Failed to write to file");
    }
 
    // 关闭 FILE 指针,这也会关闭文件描述符
    fclose(file);
 
    return 0;
}

注意事项

  • 文件描述符和 FILE 指针的关联:fdopen函数返回的FILE指针和原始文件描述符是关联的。对FILE指针的操作会影响文件描述符,反之亦然。
  • 关闭文件:使用fclose关闭FILE指针时,底层文件描述符也会被关闭。因此,不要在关闭FILE指针后再次使用该文件描述符。
  • 缓冲问题:FILE指针使用标准库缓冲机制,文件描述符直接操作文件。混合使用这两者时需要注意缓冲区的刷新问题,以避免数据不一致。

通过上述示例和说明,可以在Linux程序中灵活地在文件描述符和FILE指针之间转换,根据需要选择合适的接口进行文件操作。

创作许可协议

本项目采用 CC BY(署名) 进行许可。

评论(0)
- 没有更多了 -