最近的一次面试,可能我对面试官说我是非科班出身的吧,然后就被问到了这个问题:请你说一下什么是文件描述符。可能这个问题对科班出身的程序员来说是必会的吧。但是我的确是被这上来的第一个问题就问倒了,那究竟什么是文件描述符?
定义:
首先,我百度百科看到的对于文件描述符的定义是这样的:
内核(kernel)利用文件描述符(file descriptor)来访问文件。文件描述符是非负整数。打开现存文件或新建文件时,内核会返回一个文件描述符。读写文件也需要使用文件描述符来指定待读写的文件。
这里的内核,指的应该就是linux系统的内核了。上述定义说的文件描述符是内核返回的,也就是说系统本身或者在系统中的其他软件需要操作某个文件的时候,就必须根据系统内核返回的描述符去定位唯一的文件。
其实百度对文件描述符的表述可以了解到,文件描述符,应该就是跟数据库的id,或者索引值,是相类似的,都是用来定位唯一数据值(文件描述符定位的是唯一的文件)。
文件描述符的使用:
软件或者系统的进程可以通过系统级别的函数:open(),close(),read(),write(),lseek()等,来获取文件描述符,操作响应的文件。
在学习C语言中,还有以下的3个文件描述符是最常用到的:
- 0(c语言定义的宏名为
STDIN_FILENO,表示标准输入); - 1(c语言定义的宏名为
STDOUT_FILENO,表示标准输出); - 2(c语言定义的宏名为
STDERR_NO,表示标准出错处理)。
这三个文件描述符,在c语言的<unistd.h>头文件已经定义了三个宏。
/* Standard file descriptors. */
#define STDIN_FILENO 0 /* Standard input. */
#define STDOUT_FILENO 1 /* Standard output. */
#define STDERR_FILENO 2 /* Standard error output. */
我们初学c语言的demo常用到的函数scanf()和printf(),实际用到的就是上述的标准输入和标准输出的文件描述符。
文件描述符与文件指针的区别:
文件描述符是每个进程在PCB(Process Control Block)中保存着一份文件描述符表,其就是这个表的索引,每个表项都有一个指向已打开文件的指针。
而C语言中,使用文件指针做为I/O的句柄。文件指针指向进程用户区中的一个被称为FILE结构的数据结构。FILE结构包括一个缓冲区和一个文件描述符。而文件描述符是文件描述符表的一个索引,因此从某种意义上说文件指针就是句柄的句柄(在Windows系统上,文件描述符被称作文件句柄)。