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);
}
相关推荐
Victor3562 分钟前
Redis(142)Redis的Cluster的主从复制是如何实现的?
后端
e***58232 分钟前
Spring Cloud GateWay搭建
android·前端·后端
Victor3565 分钟前
Redis(143)Redis的Cluster的重新分片是如何实现的?
后端
倔强的石头1062 小时前
openGauss数据库:从CentOS 7.9部署到实战验证
linux·数据库·centos
梁正雄3 小时前
linux服务-Nginx+Tomcat+Redis之Session 共享 - 容器单机版
linux·nginx·tomcat
wanhengidc3 小时前
云手机是由什么组成的?
运维·服务器·web安全·游戏·智能手机
x***13393 小时前
【MyBatisPlus】MyBatisPlus介绍与使用
android·前端·后端
dvvvvvw3 小时前
调用函数两点间的距离.c
c语言
f***68605 小时前
【SpringBoot篇】详解Bean的管理(获取bean,bean的作用域,第三方bean)
java·spring boot·后端
z***75155 小时前
【Springboot3+vue3】从零到一搭建Springboot3+vue3前后端分离项目之后端环境搭建
android·前端·后端