您的位置:首页 > 运维架构 > Linux

Linux下的文件描述符和文件指针的区别

2017-05-08 22:22 211 查看
在Linux系统中一切皆可以看成是文件,文件又可分为:普通文件、目录文件、链接文件和设备文件。
文件描述符
文件描述符是内核为了高效管理已被打开的文件所创建的索引,其是一个非负整数(通常是小整数),是文件描述表的下标,用于指代被打开的文件,所有执行I/O操作的系统调用都通过文件描述符。
程序刚刚启动的时候,0是标准输入,1是标准输出,2是标准错误。如果此时去打开一个新的文件,它的文件描述符会是3。POSIX标准要求每次打开文件时(含socket)必须使用当前进程中最小可用的文件描述符号码,因此,在网络通信过程中稍不注意就有可能造成串话。标准文件描述符图如下:



文件描述与打开的文件对应模型如下图:



文件描述符的分配规律:从当前未使用的最小的整数处开始分配 
文件描述符的优点: 兼容POSIX标准,许多Linux和UNIX系统调用都依赖于它。 
文件描述符的缺点: 不能移植到UNIX以外的系统上去,也不直观。
每个进程在PCB(进程控制块)中都保存这一份文件描述符表,文件描述符就是这个表的索引其下标,
文件描述表中每个表项都有一个指向已打开文件的指针,就是FILE*结构体
FILE*是一个结构体,里面包含了文件描述符。

FILE结构体中的成员: 

缓冲区基址,缓冲区当前指针,缓冲区大小,缓冲区剩余字节个数,文件读写模式等

struct   FILE   {
char   *_ptr;//文件输入的下一个位置
int    _cnt; //当前缓冲区的相对位置
char   *_base;//指基础位置(应该是文件的其始位置)
int    _flag; //文件标志
int    _file; //文件的有效性验证
int    _charbuf;//检查缓冲区状况,如果无缓冲区则不读取
int    _bufsiz; //文件的大小
char   *_tmpfname;//临时文件名
};


文件指针
文件描述表中每个表项都有一个指向已打开文件的指针,这个指针就是文件指针。
文件指针:c语言中使用的是文件指针而不是文件描述符来作为I/O的句柄,文件指针指向进程的用户空间中一个FILE结构的数据结构,FILE结构里主要包括一个I/O缓冲区和一个文件描述符,而文件描述符值是文件描述符表中的一个索引,从某种意义上将文件指针就是句柄的句柄(在Window中文件描述符被称为文件句柄)。

文件操作符和文件指针的优缺点:

      (1)文件描述符的优点:兼容POSIX标准,许多系统调用都依赖于它;缺点是不能移植到unix之外的系统上去。
     (2)文件指针的优点:是c语言中的通用格式,便于移植。

FILE结构中含有文件描述符,那么可以使用fopen来获得文件指针,然后从文件指针获取文件描述符,文件描述符应该是唯一的,而文件指针却不是唯一的,但指向的对象是唯一的。






C语言的文件指针与文件描述符的相互转换

可通过fdopen和fileno两个函数实现。它们都包含在头文件stdio.h中。

fdopen的原型:
FILE * fdopen(int filedes, const char *opentype);
1

第一个参数filedes是一个打开的文件描述符,opentype是表示打开方式的字符串,和fopen函数具有相同的

取值,比如”w”或”w+”等。但是你必须保证该字符串的描述和文件实际的打开方式是匹配的。函数fopen()就

是返回打开文件的指针;如果操作失败,返回空指针null。

把文件流指针转换成文件描述符用fileno函数, 

其原型为:
int fileno(FILE *stream);
1

它返回和stream文件流对应的文件描述符。如果失败,返回-1。 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: