"); //-->
在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指针之间转换,根据需要选择合适的接口进行文件操作。
专栏文章内容及配图由作者撰写发布,仅供工程师学习之用,如有侵权或者其他违规问题,请联系本站处理。 联系我们
相关推荐
基于ARM的嵌入式Linux系统开发 中
嵌入式Linux优化:加快系统起动和应用起动的过程
基于ARM的嵌入式Linux系统开发 上
GeForce 590 驱动分支是首个不支持 GTX 9 和 10 系列 GPU 的分支——Linux 版本标志着定义时代显卡的终结
基于Linux平台的温度传感器DS18B20驱动程序设计
Linux系统下USB摄像头驱动开发
基于ARM的嵌入式Linux系统开发 下
Kontron与Congatec合作开发安全的嵌入式Linux平台
uClinux系统分析
Linux 今天 34 岁了
uClinux系统分析
Linux内核源代码的阅读和工具介绍(aqian转)
一种嵌入式ARM-Linux GPS智能终端设计
Linux系统的DS18B20驱动程序源代码
嵌入式LINUX开发套件常见问题解答
实时Linux技术:如何在嵌入式LINUX中应用实时特性
RK3506核心板SDK重磅升级,解锁三核A7实时控制新架构
Linux就AI生成代码定下规则:允许Copilot类工具、拒绝劣质AI代码,错误由人类负责
由于英特尔裁员和公司重组,主要的英特尔 Linux 驱动项目正在消亡
FFT公司9200的板子的资料
ARM 开发板使用手册 在三星 S3C2410开发板上烧写linux
linux入门精华
Linux中的fork与exec系列函数分析
基于ARM-Linux的MiniGUI的仿真与移植
U-BOOT 与 MontaVista Linux 的移植
[转帖]NeuLinux嵌入式Linux开发平台
彻底告别486:Linux内核维护者正式移除英特尔486处理器支持
[链接]Firefox_ 重新发现网络
Linus Torvalds 称谷歌工程师提交的 RISC-V 代码为“垃圾”,并表示它“让世界变得更糟糕”
53年后,惠普于1972年推出的总线标准获得了稳定的Linux驱动——通用接口总线拥有惊人的8 MB/s带宽