Linux文件描述符和文件指针互转

本文研究的主要是Linux中文件描述符fd与文件指针FILE*互相转换的相关内容,具体介绍如下。

简介

1.文件描述符fd的定义:

文件描述符在形式上是一个非负整数。实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。在程序设计中,一些涉及底层的程序编写往往会围绕着文件描述符展开。但是文件描述符这一概念往往只适用于UNIX、Linux这样的操作系统。

2.文件指针FILE定义说明文件指针的一般形式为

FILE *指针变量标识符;

其中FILE应为大写,它实际上是由系统定义的一个结构,该结构中含有文件名、文件状态和文件当前位置等信息。在编写源程序时不必关心FILE结构的细节。

使用系统调用的时候用文件描述符的时候比较多,但是操作比较原始。C库函数在I/O上提供了一些方便的包装(比如格式化I/O、重定向),但是对细节的控制不够。

如果过度依赖其中的一种只会徒增麻烦,所以知道两者的转换是很有必要的。FILE*是对fd的封装

glibc库提供了两个转换函数fdopen()和fileno(),都是<stdio.h>中的

api函数解析

文件路径 到 文件指针

c 复制代码
 #include <stdio.h>

FILE *fopen(const char *pathname, const char *mode);
/*
pathname:文件路径
mode:打开文件的方式
*/

文件路径 到 文件描述符

c 复制代码
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int open(const char *pathname, int flags);
/*
pathname:文件路径
flags:打开文件的属性
*/

文件描述符 到 文件指针

c 复制代码
 #include <stdio.h>

FILE *fdopen(int fd, const char *mode);
/*
fd:文件描述符
mode:必须和此文件描述符对应文件的权限一样
*/

文件指针 到 文件描述符

c 复制代码
 #include <stdio.h>
int fileno(FILE *stream);

示例

c 复制代码
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main()
{
    //打开文件
    int fd = open("filef", O_RDWR | O_CREAT,0600);
    FILE * filePtr = fopen("filef", "r+");
    
    //转换
    FILE tempPtr = fdopen(fd,"r+");
    int tempFd = fileno(filePtr);
    
    //关闭文件
    close(fd);
    fclose(filePtr);
}
相关推荐
量化分析码农5 小时前
【Python量化波动率实战 02】波动率会传染:EWMA 指数加权给近期行情更大话语权
后端
冻柠檬飞冰走茶5 小时前
字母移动游戏题解:贪心求最长可保留连续子串(附 C 实现)
c语言·开发语言·数据结构·算法·动态规划
GISer_Jing6 小时前
如何学习Agent
后端·langchain
讯捷蓝达6 小时前
戴尔R720xd服务器卡死在 “Configuring Memory...Done“,换了内存还是卡?问题根本不在内存
运维·服务器
JWASX7 小时前
【Go】map 源码解析 - group
后端·golang·map·源码分析
且从容.7 小时前
ubuntu安装flink
linux·ubuntu·flink
量化分析码农8 小时前
【Python量化波动率实战 01】波动率是怎么算的:年化、滚动与区间估计一次讲清
后端
特立独行的猫A8 小时前
AI 时代,我为什么推荐用 cj-tauri 开发桌面应用
java·后端·python
金銀銅鐵8 小时前
从一个类名到一张类图:用反射自动生成 PlantUML
java·后端·uml
数字新视界8 小时前
动环监控信创适配在智能机房管理中的应用价值与未来展望
大数据·服务器·数据库·动环监控系统·动力与环境监控系统