博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
文件描述符fd和文件指针File* fp的区别和转换
阅读量:4222 次
发布时间:2019-05-26

本文共 2496 字,大约阅读时间需要 8 分钟。

在linux系统中把设备和普通文件也都看做是文件,要对文件进行操作就必须先打开文件,打开文件后会得到一个文件描述符,它是一个很小的正整数,是一个索引值。 

内核会为每一个运行中的进程在进程控制块pcb中维护一个打开文件的记录表,每一个表项都有一个指针指向打开的文件,上边的索引值是记录表的索引值。 
文件描述符的优点:兼容POSIX标准,许多系统调用都依赖于它;缺点是不能移植到unix之外的系统上去。 
文件指针:c语言中使用的是文件指针而不是文件描述符来作为I/O的句柄,文件指针指向进程的用户空间中一个FILE结构的数据结构,FILE结构里主要包括一个I/O缓冲区和一个文件描述符,而文件描述符值是文件描述符表中的一个索引,从某种意义上将文件指针就是句柄的句柄(在Window中文件描述符被称为文件句柄)。 
文件指针的优点:是c语言中的通用格式,便于移植。 
既然FILE结构中含有文件描述符,那么可以使用fopen来获得文件指针,然后从文件指针获取文件描述符,文件描述符应该是唯一的,而文件指针却不是唯一的,但指向的对象是唯一的。

 

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

2.文件指针FILE定义说明文件指针的一般形式为: 
FILE *指针变量标识符; 
其中FILE应为大写,它实际上是由系统定义的一个结构,该结构中含有文件名、文件状态和文件当前位置等信息。在编写源程序时不必关心FILE结构的细节。 
在使用文件时,需要在内存中为其分配空间,用来存放文件的基本信息,给结构体类型是由系统定义的,规定该类型为FILE型,其声明如下:

typedef struct{short level;unsigned flags;char fd;unsigned char hold;short bsize;unsigned char *buffer;unsigned ar *curp;unsigned istemp;short token;}FILE;

例如: 

FILE *fp; 
表示fp是指向FILE结构的指针变量,通过fp即可找存放某个文件信息的结构变量,然后按结构变量提供的信息找到该文件,实施对文件的操作。习惯上也笼统地把fp称为指向一个文件的指针。

3.fd和FILE*的关系 

简单来说 FILE*中的内容包括文件描述符和缓冲区。 
使用fopen,fclose,fread,fwrite对文件进行操作,他们属于C库函数,在lib层中。返回值为FILE*。FILE*为文件指针。 
文件指针是指向一个FILE的结构体,这个结构体里包括一个文件描述符和一个I/O缓冲区。文件描述符用于C标准的IO库调用中,用于标识文件。 
系统调用接口为:open/close/read/write 
他们的返回值为文件描述符(fb),类型为int. 
文件描述符就是open文件时产生的一个很小的正整数,是一个索引值,它用于UNIX系统中,用于标识文件。内核会为每一个运行中的进程在进程控制块PCB中维护一个打开文件的记录表,也就是文件对象表,每一个表项都有一个指针指向打开的文件,上边的索引值就是记录表的索引值。 
打开一个进程后,要打开默认的输出输入流,他们分别为:stderr,stdin , stdout.对应的文件描述符为0,1,2。 
这里写图片描述

fd转换为fp

int main(int argc, char *argv[]){    FILE *fp = NULL;    fp  = fopen("/home/super_bert/test.dat", "r");    /*得到文件指针*/    if (fp == NULL)    {        perror("open file error.");        exit(1);    }    else    {        printf("open file successfully...\n");    }    int fd;    fd = fileno(fp);    /*文件指针转换为文件描述符*/    if (-1 == fd)    {        perror("fp to fd error.");    }    else    {        printf("transform successfully...\n")        exit(1);    }    return 0;}

fp转换为fd

int main(int argc, char *argv[]){    int  fd;    fd = open("/home/super_bert/test.dat", O_CREAT|O_RDWR, 0666);    /*得到文件描述符*/    if ( -1 == fd )    {        perror("open file error.");        exit(1);    }    else    {        printf("open file successfully...\n");    }    FILE *fp = NULL;    fp = fdopen(fd, "r");       /*文件描述符转换为文件指针*/    if (NULL == fp)    {        perror("fd to fp error.");    }    else    {        printf("transform successfully...\n");        exit(1);    }    return 0;}

参考博客:C语言文件操作详解 

你可能感兴趣的文章
使用Beyond Compare对比文件夹
查看>>
深入理解java虚拟机 -- jVM高级特性与最佳实践
查看>>
阿里巴巴 java 开发规约
查看>>
impdp命令出现ora-39070解决方案
查看>>
ora-01756
查看>>
java 核心技术Ⅱ--章四:网络
查看>>
java 核心技术Ⅱ--章五:JDBC数据库编程
查看>>
java 核心技术Ⅱ--章六:时间与日期API
查看>>
链表,循环链表,双向链表,判环和入环点
查看>>
浅谈HashMap,HashTable,ConcurrentHashMap,WeakHashMap,HashMap源码分析
查看>>
云创大数据校企合作项目斩获“全国校企合作十佳案例”
查看>>
云创大数据与宽泛科技签订战略合作协议
查看>>
免费!免费!免费!全国高校大数据师资实战免费培训班
查看>>
“南京市独角兽瞪羚企业俱乐部创始人简餐会”走进云创
查看>>
本科大数据专业该怎么上?
查看>>
云创大数据1+X大数据应用部署与调优职业技能等级证书预申报正式开启!
查看>>
人工智能需要一个可被证明的理论作为基础 | 哈佛丘成桐
查看>>
入门 | 一文概览深度学习中的激活函数
查看>>
一分钟整明白Tensorflow Extended
查看>>
人工智能再次参加高考:和作家比写作文,AI能打多少分?
查看>>