当前位置: 首页 > news >正文

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

目录

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

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


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

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

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

相关文章:

  • 7月形势分析-您下一步该如何做,才能走出困境?
  • 零基础开始学习鸿蒙开发-读书app简单的设计与开发
  • 探索 Electron:将 Web 技术带入桌面应用
  • 【python报错】已解决 ERROR: Could not find a version that satisfies the requirement
  • JDK动态代理-AOP编程
  • el-config-provider在Vue3中自定义命名空间实现
  • 【笔记】Spring Cloud Gateway 实现 gRPC 代理
  • MM-LLM:使用Llava类构建图文多模态大模型实践
  • js中添加数组元素的方法
  • Go语言学习:每日一练2
  • EFCore_悲观锁与乐观锁(MySQL)
  • Unity 粒子特效(下)
  • 服务器BMC基础知识总结
  • vue3弹窗usehook
  • C#面:举列 a=10,b=15,在不用第三方变量的前提下,把a,b的值互换
  • 网络传输文件的问题
  • (三)从jvm层面了解线程的启动和停止
  • angular组件开发
  • C++类的相互关联
  • httpie使用详解
  • laravel with 查询列表限制条数
  • PHP的类修饰符与访问修饰符
  • Rancher-k8s加速安装文档
  • React中的“虫洞”——Context
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • Spring Boot快速入门(一):Hello Spring Boot
  • WordPress 获取当前文章下的所有附件/获取指定ID文章的附件(图片、文件、视频)...
  • 诡异!React stopPropagation失灵
  • 看域名解析域名安全对SEO的影响
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 盘点那些不知名却常用的 Git 操作
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • 一道闭包题引发的思考
  • 责任链模式的两种实现
  • 中国人寿如何基于容器搭建金融PaaS云平台
  • ​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • #微信小程序:微信小程序常见的配置传旨
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • (3)nginx 配置(nginx.conf)
  • (html5)在移动端input输入搜索项后 输入法下面为什么不想百度那样出现前往? 而我的出现的是换行...
  • (二) Windows 下 Sublime Text 3 安装离线插件 Anaconda
  • (附源码)ssm跨平台教学系统 毕业设计 280843
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (规划)24届春招和25届暑假实习路线准备规划
  • (亲测有效)推荐2024最新的免费漫画软件app,无广告,聚合全网资源!
  • (十二)devops持续集成开发——jenkins的全局工具配置之sonar qube环境安装及配置
  • (四)库存超卖案例实战——优化redis分布式锁
  • (源码版)2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模
  • (转)大型网站架构演变和知识体系
  • ******IT公司面试题汇总+优秀技术博客汇总
  • ***php进行支付宝开发中return_url和notify_url的区别分析
  • .net 4.0发布后不能正常显示图片问题
  • .net MySql