文件描述符与文件指针的区别

来源:互联网 发布:淘宝的港版beats能买吗 编辑:程序博客网 时间:2024/05/18 16:17

文件指针:C语言中使用文件指针做为I/O的句柄。文件指针指向进程用户区中的一个被称为FILE结构数据结构。FILE结构包括缓冲区文件描述符。而文件描述符是文件描述符表的一个索引,也就是说c语言的文件指针是Linux系统中对文件描述符的一种封装  

下面看FILE结构体里面都有那些成员


上面是文件指针指向的结构体,可以发现文件指针结构体包含文件描述符,说明文件指针是对文件描述符的一种封装。文件指针是C语言库里的提供的一个结构体,文件描述符是系统调用接口

为什么系统已经有了文件描述符,库里面还要对其做一层封装呢?也是优点:一、方便程序员使用;二、可以提高程序的移植性。

FILE结构体里面还有缓冲区:

将数据写入硬盘文件中时,缓冲区的刷新方式默认为全缓冲,

将数据写入显示文件中,缓冲区的刷新方式默认为行缓冲;

而系统调用的函数write()写入时,是没有缓冲的,是因缓冲区是C库提供的,在FILE结构体里。文件描述符和缓冲区都是FILE结果体的成员,所以文件描述符指向的file结构体里是没有缓冲区的。



文件描述符:Linux系统中打开文件就会获得文件描述符,它是个很小的正整数。每个进程在PCB(Process Control Block)中保存着一份文件描述符表,文件描述符就是这个表的索引,每个表项都有一个指向已打开文件的指针,已打开的文件在内核中用file结构体表示,文件描述符表中的指针指向file结构体


标准输入(stdin)的文件描述符是 0

标准输出(stdout)的文件描述符是 1

标准错误(stderr)的文件描述符是 2

文件描述符的分配规则:从当前未被分配的最小整数处分匹配。

下面看文件file结构体


shell 和很多应用程序都使用这种习惯,因此,如果内核不遵循这种习惯的话,很多应用程序将不能使用。
POSIX 定义了 STDIN_FILENOSTDOUT_FILENO STDERR_FILENO来代替
 012。这三个符号常量的定义位于头文件 unistd.h。

文件描述符的有效范围是 0 到 OPEN_MAX。一般来说,每个进程最多可以打开 64 个文件(0 — 63)。对于 FreeBSD 5.2.1、Mac OS X 10.3 和 Solaris 9 来说,每个进程最多可以打开文件的多少取决于系统内存的大小,int 的大小,以及系统管理员设定的限制。Linux 2.4.22 强制规定最多不能超过 1, 048, 576 。
优点
兼容POSIX标准,许多Linux和UNIX系统调用都依赖于它。
缺点
文件描述符的概念存在两大缺点 :
一、在非UNIX / Linux操作系统上(如Windows NT),无法基于这一概念进行编程。
二、由于文件描述符在形式上不过是个整数,当代码量增大时,会使编程者难以分清哪些整数意味着数据,那些意味着文件描述符。因此,完成的代码可读性也就会变得很差。


1 0
原创粉丝点击