专栏中心

EEPW首页 > 专栏 > Linux文件描述符与FILE指针互相转换

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

发布人:美男子玩编程 时间:2024-07-29 来源:工程师 发布文章

在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指针之间转换,根据需要选择合适的接口进行文件操作。

专栏文章内容及配图由作者撰写发布,仅供工程师学习之用,如有侵权或者其他违规问题,请联系本站处理。 联系我们

关键词: Linux FILE指针

相关推荐

基于ARM的嵌入式Linux系统开发 中

视频 2009-10-22

嵌入式Linux优化:加快系统起动和应用起动的过程

视频 2009-10-22

基于ARM的嵌入式Linux系统开发 上

视频 2009-10-22

GeForce 590 驱动分支是首个不支持 GTX 9 和 10 系列 GPU 的分支——Linux 版本标志着定义时代显卡的终结

基于ARM的嵌入式Linux系统开发 下

视频 2009-10-22

Kontron与Congatec合作开发安全的嵌入式Linux平台

Linux 今天 34 岁了

实时Linux技术:如何在嵌入式LINUX中应用实时特性

视频 2009-10-22

RK3506核心板SDK重磅升级,解锁三核A7实时控制新架构

2025-12-18

Linux就AI生成代码定下规则:允许Copilot类工具、拒绝劣质AI代码,错误由人类负责

由于英特尔裁员和公司重组,主要的英特尔 Linux 驱动项目正在消亡

FFT公司9200的板子的资料

ARM 开发板使用手册 在三星 S3C2410开发板上烧写linux

linux入门精华

Linux中的fork与exec系列函数分析

嵌入式系统 2025-08-06

U-BOOT 与 MontaVista Linux 的移植

彻底告别486:Linux内核维护者正式移除英特尔486处理器支持

Linus Torvalds 称谷歌工程师提交的 RISC-V 代码为“垃圾”,并表示它“让世界变得更糟糕”

嵌入式系统 2025-08-11

53年后,惠普于1972年推出的总线标准获得了稳定的Linux驱动——通用接口总线拥有惊人的8 MB/s带宽

更多 培训课堂
更多 焦点
更多 视频

技术专区