您的位置:首页 > 其它

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

2017-05-08 20:32 344 查看
文件指针: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),无法基于这一概念进行编程。

二、由于文件描述符在形式上不过是个整数,当代码量增大时,会使编程者难以分清哪些整数意味着数据,那些意味着文件描述符。因此,完成的代码可读性也就会变得很差。


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: