文件描述符fd和文件指针File* fp的区别和转换
在linux系统中把设备和普通文件也都看做是文件,要对文件进行操作就必须先打开文件,打开文件后会得到一个文件描述符,它是一个很小的正整数,是一个索引值。
内核会为每一个运行中的进程在进程控制块pcb中维护一个打开文件的记录表,每一个表项都有一个指针指向打开的文件,上边的索引值是记录表的索引值。
文件描述符的优点:兼容POSIX标准,许多系统调用都依赖于它;缺点是不能移植到unix之外的系统上去。
文件指针:c语言中使用的是文件指针而不是文件描述符来作为I/O的句柄,文件指针指向进程的用户空间中一个FILE结构的数据结构,FILE结构里主要包括一个I/O缓冲区和一个文件描述符,而文件描述符值是文件描述符表中的一个索引,从某种意义上将文件指针就是句柄的句柄(在Window中文件描述符被称为文件句柄)。
文件指针的优点:是c语言中的通用格式,便于移植。
既然FILE结构中含有文件描述符,那么可以使用fopen来获得文件指针,然后从文件指针获取文件描述符,文件描述符应该是唯一的,而文件指针却不是唯一的,但指向的对象是唯一的。
1.文件描述符fd的定义:文件描述符在形式上是一个非负整数。实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。在程序设计中,一些涉及底层的程序编写往往会围绕着文件描述符展开。但是文件描述符这一概念往往只适用于UNIX、Linux这样的操作系统。
2.文件指针FILE定义说明文件指针的一般形式为:
FILE *指针变量标识符;
其中FILE应为大写,它实际上是由系统定义的一个结构,该结构中含有文件名、文件状态和文件当前位置等信息。在编写源程序时不必关心FILE结构的细节。
在使用文件时,需要在内存中为其分配空间,用来存放文件的基本信息,给结构体类型是由系统定义的,C语言规定该类型为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语言文件操作详解 http://www.cnblogs.com/likebeta/archive/2012/06/16/2551780.html
文件描述符fd和文件指针File* fp的区别和转换相关推荐
- linux 文件指针,Linux中文件描述符fd与文件指针FILE*互相转换实例解析
本文研究的主要是Linux中文件描述符fd与文件指针FILE*互相转换的相关内容,具体介绍如下. 1.文件描述符fd的定义:文件描述符在形式上是一个非负整数.实际上,它是一个索引值,指向内核为每一个进 ...
- linux中文件描述符fd和文件指针flip的理解
整理自:http://www.cnblogs.com/Jezze/archive/2011/12/23/2299861.html 简单归纳:fd(file descriptor)只是一个整数,在ope ...
- 文件描述符fd、文件指针fp和vfork()
1. fd:在形式上是一个非负整数.实际上他是一个索引值.指向kernal为每一个进程所维护的该进程打开文件的记录表. 当程序打开一个文件或者创建一个新文件的时候kernal向进程返回一个文件描述符. ...
- linux文件描述符与标识符,文件描述符fd
这里以问答的方式来讨论这个问题: 1. 文件描述符 fd 和文件指针 FILE *的关系? 文件描述符是什么?我们知道每一个进程都有一个自己的PCB(进程控制块),进程控制块的结构是: struct ...
- android MemeoryFile和Parcel操作文件描述符fd
ParcelFileDescriptor pfd; FileDescriptor fd; Parcel p; static byte[] testString = new byte[] {1,2,3, ...
- <Linux基础--文件描述符fd、重定向、文件流指针FILE*概念理解>
文章目录 1.文件描述符fd 2.重定向 3.文件流指针:FILE* 4.动态库和静态库 1.文件描述符fd 文件描述符:实际上就是内核中一个进程打开的文件描述信息数组(file* fd_array[ ...
- linux存储--文件描述符fd与FILE结构体(二)
文件描述符fd 对于linux而言,所有对设备(对于linux而言,一切皆文件)和文件的操作都使用文件描述符来进行的. 文件描述符是一个非负的整数,它是一个索引值,指向内核中每个进程打开文件的记录表. ...
- [转]文件IO详解(二)---文件描述符(fd)和inode号的关系
原文:https://www.cnblogs.com/frank-yxs/p/5925563.html 文件IO详解(二)---文件描述符(fd)和inode号的关系 ---------------- ...
- 存储基础 — 文件描述符 fd 究竟是什么?
坚持思考,就会很酷 前情概要 通过上篇 Go 存储基础 - 文件 IO 的姿势, 我们看到有两种文件读写的方式,一种是系统调用的方式,操作的对象是一个整数 fd,另一种是 Go 标准库自己封装的标准库 ...
最新文章
- R语言ggplot2可视化:使用ggplot2绘制按时间顺序排列的时间线图(chronological timeline plot)
- JS调用PageMethods(转)
- python好学嘛-马哥教育官网-专业Linux培训班,Python培训机构
- codevs 1958 刺激
- Winform中选取指定文件夹并获取其下所有文件
- 做fzu oj 1045 做减法学到的sprintf()函数
- 01)自学JavaScript
- 什么是慢查询?如何通过慢查询日志优化?
- mysql 存储过程 replace_mysql replace存储过程
- React Native顶|底部导航使用小技巧
- 富文本编辑器中空格转化为a_熙态农业:富硒鸡蛋有什么营养价值?
- CNN破解简单验证码(Tensorflow实现)
- 自定义“TB_定位访问”子类
- 3G时代日本手机咸鱼难翻身
- java 8 排序_java8——排序
- 板级电源究竟该怎么选型芯片?(实战篇)
- 智能衣橱控制系统的设计
- IDEA编译错误PersistentEnumerator storage corrupted
- 常见的保险产品类别-年金保险、意外险
- 如何才能不改变图片的像素大小,只改变图片的文件大小
热门文章
- spring--ApplicationContextAware
- 更高的抵押贷款利率对美国房地产市场意味着什么?
- c++代码使用堆空间实现数据结构栈
- antd3.x版本table使用fixed错位问题修复
- CAXA 2020电子图板设计从入门到精通视频教程
- MATLAB 学习笔记(3)MATLAB 矩阵的进阶操作
- 周岁年龄计算 js版 实时年龄
- 硬件知识:独立显卡和集成显卡的区别
- 80端口跟8080端口有什么具体区别?
- 笔记本电脑无法进入睡眠状态_笔记本电脑进入睡眠状态后无法通过鼠标或键盘来唤醒屏幕怎么解决...