文件描述符及文件指针
来源:互联网 发布:软件过程规范 编辑:程序博客网 时间:2024/05/16 17:16
文件描述符:在linux系统中打开文件就会获得文件描述符,它是个很小的正整数。每个进程在PCB(ProcessControl Block)中保存着一份文件描述符表,文件描述符就是这个表的索引,每个表项都有一个指向已打开文件的指针。
文件指针:C语言中使用文件指针做为I/O的句柄。文件指针指向进程用户区中的一个被称为FILE结构的数据结构。FILE结构包括一个缓冲区和一个文件描述符。而文件描述符是文件描述符表的一个索引,因此从某种意义上说文件指针就是句柄的句柄(在Windows系统上,文件描述符被称作文件句柄)。
在/usr/include下的文件里我们可以找到FILE结构体的定义(以Centos 6.4 为例,不同系统有差异):
stdio.h
typedef struct _IO_FILE __FILE;
用grep –Rnw _IO_FILE 查找,可知_IO_FILE定义于libio.h
libio.h
struct _IO_FILE { int_flags; /* High-order word is _IO_MAGIC; rest is flags. */#define _IO_file_flags _flags /* The following pointers correspond to the C++ streambufprotocol. */ /*Note: Tk uses the _IO_read_ptr and_IO_read_end fields directly. */ char* _IO_read_ptr; /* Currentread pointer */ char* _IO_read_end; /* End ofget area. */ char* _IO_read_base; /* Start ofputback+get area. */ char* _IO_write_base; /* Start of put area. */ char* _IO_write_ptr; /* Currentput pointer. */ char* _IO_write_end; /* End ofput area. */ char* _IO_buf_base; /* Start ofreserve area. */ char* _IO_buf_end; /* End ofreserve area. */ /*The following fields are used to support backing up and undo. */ char *_IO_save_base; /* Pointer to start of non-current get area. */ char *_IO_backup_base; /* Pointerto first valid character of backup area */ char *_IO_save_end; /* Pointer to end of non-current get area. */ struct _IO_marker *_markers; struct _IO_FILE *_chain; int_fileno;#if 0 int_blksize;#else int_flags2;#endif _IO_off_t _old_offset; /* This used to be _offset but it's toosmall. */ #define __HAVE_COLUMN /* temporary */ /*1+column number of pbase(); 0 is unknown. */ unsigned short _cur_column; signed char _vtable_offset; char _shortbuf[1]; /* char* _save_gptr; char* _save_egptr; */ _IO_lock_t *_lock;#ifdef _IO_USE_OLD_IO_FILE};
从FILE数据结构我们可以看出:struct FILE中包含文件状态(flag),对应的文件描述符(_fileno),及很多和流缓冲区相关的操作指针。故文件指针与文件描述符是1对1 的关系,两者可以相互转换。其转换可利用以下函数:
从描述符获取文件指针:fdopen
从指针获取文件描述符:fileno
附:
文件描述符和内核file数据结构
每个进程在PCB(ProcessControl Block)中都保存着一份文件描述符表,文件描述符就是这个表的索引,每个表项都有一个指向已打开文件的指针。即当打开一个文件时,内核会为已打开的文件创建一个file 结构体,文件描述符表中的指针指向file结构体。以下是一些常用场景下两者的关系:
1、 打开同一个文件,可能其file结构体不一样,这点可以从file结构体中存放了文件状态(读写权限等),文件偏移量,和文件目录项等数据不一样来理解。
2、 可使用dup,fork等函数进行文件描述符复制,这时会导致多个文件描述符指向同一个file结构体,其file数据结构的引用计数+1
3、 当调用close关闭文件时,file结构体中对应的文件引用计数-1,当计数达到0时才真正关闭文件。
p.s:内核中的file结构与FILE结构又是两个不同的概念。
参考链接:
http://blog.chinaunix.net/uid-20672257-id-1901040.html
想理解内核文件系统的话可以看下,文章写得很好
- 文件描述符及文件指针
- 文件指针 & 文件描述符
- 文件描述符&文件指针
- 文件指针FILE*及文件描述符fd
- 文件指针、文件描述符、文件句柄
- 文件描述符,文件流,文字指针
- 区别:文件描述符与文件指针
- 浅谈文件描述符与文件指针
- 文件描述符与文件指针
- 文件描述符与文件指针
- 文件描述符与文件指针
- 文件描述符与文件指针
- “文件指针,文件句柄,文件描述符” 的区别
- 文件描述符,文件指针,文件路径三者转换
- 文件描述符和文件指针区别
- 文件指针和文件描述符
- 文件指针和文件描述符
- Linux文件描述符和文件指针
- Spring对jdbc的支持。
- Celery(二)-----------------使用Celery的第二步
- Android多媒体之MediaPlayer
- hdu 欧拉回路(判断)
- 十本最经典的java书籍
- 文件描述符及文件指针
- springmvc数据格式化
- essential c++ 练习题(1)
- 练习打字第十天!
- linux基本命令(25)——linux文件属性详解
- 第24讲 项目4 个人所得税计算器(if语句)
- Xpath语法
- 在Android中Context.getResource和R.id.XX方式访问资源的区别
- SpringMVC helloworld (xml版本)