文件描述符与FILE之间的关系
1.文件描述符:
在Linux系统中一切皆可以看成是文件,文件又可分为:普通文件、目录文件、链接文件和设备文件。文件描述符
(file descriptor)是内核为了高效管理已被打开的文件所创建的索引,其是一个非负整数(通常是小整数),用于
指代被打开的文件,所有执行I/O操作的系统调用都通过文件描述符。POSIX标准要求每次打开文件时(含socket)
必须使用当前进程中最小可用的文件描述符号码,因此,在网络通信过程中稍不注意就有可能造成串话。
三种标准输出流:stdin,stdout,stderr.
#include<stdio.h>
extern FILE* stdin; extern FILE * stdout; extern FILE * stderr;
FILE*这种方式是由C语言(标准库)提供的;系统中任何一个程序运行起来都会默认得与这个程序关联3个标准输入
输出流。
(1)文件标识符:0表示标准输入;1表示标准输出;2表示标准错误。
(2) 文件描述符是从0开始的一连串的小整数,程序运行起来后形成了一个进程,通过进程找到文件,默认打开3 个
文件0,1,2.之后打开的文件的文件描述符从3开始递增。 一旦关闭某个文件描述符,则之后的文件描述符先为那个关闭
文件描述符,接着从3开始递增。
2.文件描述符的优点
兼容POSIX标准,许多Linux和UNIX系统调用都依赖于它。
文件描述符的缺点
文件描述符的概念存在两大缺点 :
(1)在非 UNIX / Linux 操作系统上(如 Windows NT ),无法基于这一概念进行编程。
(2)由于文件描述符在形式上不过是个整数,当代码量增大时,会使编程者难以分清哪些整数意味着数据,那些意
味着文件描述符。因此,完成的代码可读性也就会变得很差。
3.FILE结构体里面还有缓冲区:
将数据写入硬盘文件中时,缓冲区的刷新方式默认为全缓冲。将数据写入显示文件中,缓冲区的刷新方式默认为行缓
冲;而系统调用的函数write()写入时,是没有缓冲的,是因缓冲区是C库提供的,在FILE结构体里。文件描述符和缓
冲区都是FILE结果体的成员,所以文件描述符指向的file结构体里是没有缓冲区的。
举例说明
open和fopen的区别:
open函数原型:#include <fcntl.h>
int open(const
char *pathname, int oflag, ... );
文件描述符就是open文件时产生的一个整数,直到一个索引作用,它用于UNIX系统中,用于标识文件。
文件指针是指向一个FILE的结构体,这个结构体里有一个元素就是文件描述符。它用于ANSI C标准的IO库调用中,用
于标识文件。
既然FILE中包含文件描述符元素,可以用fopen()直接获取指针fp,然后使用fp获得fp中所包含文件描述符fd的信
息。
文件描述符应该是唯一的,但文件指针(值)却不是唯一的,但指向的对象却应该是唯一的。
FILE *中除了包含了fd信息,还包含了IO缓冲,所以可以理解为FILE是对fd的墙头,是C标准形式,所以FILE *比fd适
合跨平台,应该多用fopen在,少用open。
C语言文件指针与文件描述符之间可以相互转换:
int fileno(FILE *stream);
FILE *fdopen(int fd, const char *mode);