Linux中文件指针和文件描述符的区

文件描述符

       在linux系统中打开文件就会获得文件描述符,它是个很小的正整数。每个进程在PCB(Process Control Block)中保存着一份文件描述符表,文件描述符就是这个表的索引,其实就是文件数组下标,文件描述符是系统调用层次上的,每个表项都一个指向已打开文件的指针。

文件指针

       C语言中使用的是文件指针而不是文件描述符做为I/O的句柄。文件指针指向进程用户区中的一个被称为FILE结构的数据结构。FILE结构包括一个缓冲区和一个文件描述符。而文件描述符是文件描述符表的一个索引,因此从某种意义上说文件指针就是句柄的句柄(在Windows系统上,文件描述符被称作文件句柄)。FILE *中除了包含了fd信息,还包含了IO缓冲,是C标准形式,所以FILE *比fd更适合跨平台,应该多用fopen在,少用open。

C语言文件指针与文件描述符之间可以相互转换:

       这要通过fdopen和fileno两个函数实现。它们都包含在头文件stdio.h中。
       fdopen的原型: FILE * fdopen(int filedes, const char *opentype);
       第一个参数filedes是一个打开的文件描述符,opentype是表示打开方式的字符串,和fopen函数具有相同的取值,比如"w"或"w+"等。但是你必须保证该字符串的描述和文件实际的打开方式是匹配的。函数fopen()就是返回打开文件的指针;如果操作失败,返回空指针null。
     把文件流指针转换成文件描述符用fileno函数,其原型为:
    int fileno(FILE *stream);
     它返回和stream文件流对应的文件描述符。如果失败,返回-1。

     当程序执行时,就已经有三个文件流打开了,它们分别是标准输入stdin,标准输出stdout和标准错误输出stderr。和流式文件相对应的是,也有三个文件描述符被预先打开,它们分别是0,1,2,代表标准输入、标准输出和标准错误输出。


       像上图所示,文件指针是文件描述符的一层封装,文件指针最终调用的还是文件描述符。


发布了53 篇原创文章 · 获赞 3 · 访问量 2万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章