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);
}
相关推荐
天天摸鱼的java工程师6 分钟前
从被测试小姐姐追着怼到运维小哥点赞:我在项目管理系统的 MySQL 优化实战
java·后端·mysql
搬码临时工8 分钟前
如何把本地服务器变成公网服务器?内网ip网址转换到外网连接访问
运维·服务器·网络·tcp/ip·智能路由器·远程工作·访问公司内网
vortex512 分钟前
探索 Shell:选择适合你的命令行利器 bash, zsh, fish, dash, sh...
linux·开发语言·bash·shell·dash
专注VB编程开发20年14 分钟前
asp.net mvc如何简化控制器逻辑
后端·asp.net·mvc
HUN金克斯24 分钟前
C++/C函数
c语言·开发语言·c++
慢半拍iii25 分钟前
数据结构——F/图
c语言·开发语言·数据结构·c++
m0_6371469335 分钟前
零基础入门 C 语言基础知识(含面试题):结构体、联合体、枚举、链表、环形队列、指针全解析!
c语言·开发语言·链表
GalaxyPokemon36 分钟前
LeetCode - 148. 排序链表
linux·算法·leetcode
用户67570498850244 分钟前
告别数据库瓶颈!用这个技巧让你的程序跑得飞快!
后端