1文件描述符,在linux系统中,设备也是以文件的形式存在,要对该设备进行操作就必须先打开这个文件,打开这个文件就会获得这个文件描述符,它是个很小的正整数,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。
文件描述符的优点:兼容POSIX标准,许多Linux和UNIX系统调用都依赖于它。
缺点:不能移植到非UNIX系统上,也不直观。
文件指针,C语言中使用的是文件指针而不是文件描述符作为I/O的句柄,“文件指针(file pointer)”指向进程用户区中的一个被称为FILE结构的数据结构。FILE结构包括一个缓冲区和一个文件描述符值。而文件描述符值是文件描述符表中的一个索引。从某种意义上来说,文件指针就是句柄的句柄。
2. 文件指针/句柄(FILE*)、文件描述符以及文件路径(filepath)的相互转换
文件路径 到 文件指针:filepath --fopen()-->FILE*;
文件路径 到 文件描述符:filepath--open()--fd;
文件描述符 到 文件指针:fd--fdopen()-->FILE*;
文件路径 到 文件描述符:filepath--open()--fd;
文件描述符 到 文件指针:fd--fdopen()-->FILE*;
文件指针 到 文件描述符:FILE*--fileno()--->fd;
3.示列:
int main(int argc, char **argv)
{
FILE *fp;
printf("stdin fileno:%d ",fileno(stdin));
printf("stdout fileno:%d ",fileno(stdout));
printf("stderr fileno:%d ",fileno(stderr));
fp = fopen("aa.c","w+");
printf("aa.c'fileno %d ",fp->_fileno);
return 0;
}
{
FILE *fp;
printf("stdin fileno:%d ",fileno(stdin));
printf("stdout fileno:%d ",fileno(stdout));
printf("stderr fileno:%d ",fileno(stderr));
fp = fopen("aa.c","w+");
printf("aa.c'fileno %d ",fp->_fileno);
return 0;
}