文件描述符与文件指针
来源:互联网 发布:网络恐怖主义的成因 编辑:程序博客网 时间:2024/05/18 14:43
一. 什么是文件描述符(fd)
文件描述符在形式上是一个非负整数。实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。文件描述符的有效范围是 0 到 OPEN_MAX。
习惯上,标准输入(standard input)的文件描述符是 0,标准输出(standard output)是 1,标准错误(standard error)是 2。
二. 如何创建文件描述符
进程获取文件描述符最常见的方法是通过本机子例程open或create获取或者通过从父进程继承。后一种方法允许子进程同样能够访问由父进程使用的文件。文件描述符对于每个进程一般是唯一的。当用fork子例程创建某个子进程时,该子进程会获得其父进程所有文件描述符的副本,这些文件描述符在执行fork时打开。在由fcntl、dup和dup2子例程复制或拷贝某个进程时,会发生同样的复制过程。
对于每个进程,操作系统内核在u_block结构中维护文件描述符表,所有的文件描述符都在该表中建立索引。
三. 文件描述符与打开文件之间的关系
1.进程级别的文件描述符表
struct files_struct {atomic_t count; /* 共享该表的进程数 */rwlock_t file_lock; /* 保护以下的所有域,以免在tsk->alloc_lock中的嵌套*/int max_fds; /*当前文件对象的最大数*/int max_fdset; /*当前文件描述符的最大数*/ int next_fd; /*已分配的文件描述符加1*/struct file ** fd; /* 指向文件对象指针数组的指针 */fd_set *close_on_exec; /*指向执行exec( )时需要关闭的文件描述符*/fd_set *open_fds; /*指向打开文件描述符的指针*/fd_set close_on_exec_init;/* 执行exec( )时需要关闭的文件描述符的初 值集合*/ fd_set open_fds_init; /*文件描述符的初值集合*/struct file * fd_array[32];/* 文件对象指针的初始化数组*/};
2.系统级别的文件描述符表
struct file{struct list_head f_list; /*所有打开的文件形成一个链表*/struct dentry *f_dentry; /*指向相关目录项的指针*/struct vfsmount *f_vfsmnt; /*指向VFS安装点的指针*/struct file_operations *f_op; /*指向文件操作表的指针*/mode_t f_mode; /*文件的打开模式*/loff_t f_pos; /*文件的当前位置*/unsigned short f_flags; /*打开文件时所指定的标志*/unsigned short f_count; /*使用该结构的进程数*/unsigned long f_reada, f_ramax, f_raend, f_ralen, f_rawin;/*预读标志、要预读的最多页面数、上次预读后的文件指针、预读的字节数以及预读的页面数*/int f_owner; /* 通过信号进行异步I/O数据的传送*/unsigned int f_uid, f_gid; /*用户的UID和GID*/int f_error; /*网络写操作的错误码*/unsigned long f_version; /*版本号*/void *private_data; /* tty驱动程序所需 */};
3.文件系统的i-node表。
四. 什么是文件指针
定义说明文件指针的一般形式为:
FILE *指针变量标识符;
其中FILE应为大写,它实际上是由系统定义的一个结构,该结构中含有文件名、文件状态和文件当前位置等信息。在编写源程序时不必关心FILE结构的细节。
在使用文件时,需要在内存中为其分配空间,用来存放文件的基本信息,给结构体类型是由系统定义的,C语言规定该类型为FILE型,其声明如下:
typedef struct{ short level; unsigned flags; char fd; unsigned char hold; short bsize; unsigned char *buffer; unsigned ar *curp; unsigned istemp; short token;}FILE;
例如:
FILE *fp;
表示fp是指向FILE结构的指针变量,通过fp即可找存放某个文件信息的结构变量,然后按结构变量提供的信息找到该文件,实施对文件的操作。习惯上也笼统地把fp称为指向一个文件的指针。
五. 文件描述符与文件指针的区别
文件描述符:在linux系统中打开文件就会获得文件描述符,它是个很小的正整数。每个进程在PCB(Process Control Block)中保存着一份文件描述符表,文件描述符就是这个表的索引,每个表项都有一个指向已打开文件的指针。文件指针:C语言中使用文件指针做为I/O的句柄。文件指针指向进程用户区中的一个被称为FILE结构的数据结构。FILE结构包括一个缓冲区和一个文件描述符。而文件描述符是文件描述符表的一个索引,因此从某种意义上说文件指针就是句柄的句柄(在Windows系统上,文件描述符被称作文件句柄)。
参考资料:
http://baike.baidu.com/link?url=cs7c4eQaE-tMKzlkQTioIWBDRwP9xSCghcIsUa4xNT4XwRo3mmeT3Jfe7zmYMI3ZJ_4wi-76wOuOB1quyH0Tevc_X4M-HX7TSAHtnG5HH_nliqIGm1nDq_YbP0RLIZ2njwZXAa9cMs03yMT8gd4fA_
http://baike.baidu.com/link?url=3y39X9Xz–SUTLyJQ6KLgqdazsQrxp1qc-NloFRTCACRgUXMpqH4f9funjTYcQUMMyJhKkx1na5dRzz4mLbUbDIIYVZI1aWe2SU2ITLizV6qVuxHKzFepoq4U2FfcoHC
http://blog.csdn.net/lf_2016/article/details/54605651
http://www.linuxprobe.com/linux-file-descriptor.html
- 区别:文件描述符与文件指针
- 浅谈文件描述符与文件指针
- 文件描述符与文件指针
- 文件描述符与文件指针
- 文件描述符与文件指针
- 文件描述符与文件指针
- 文件指针 & 文件描述符
- 文件描述符&文件指针
- C文件指针与文件描述符转换
- 文件描述符与文件指针的相互转化
- 文件描述符与文件指针的区别
- 文件描述符与文件指针的相互转化
- 文件描述符与文件指针的相互转化
- 文件描述符与文件指针的相互转化
- 文件描述符fd与文件指针FILE*的关系
- Linux下的文件描述符与文件指针
- 文件描述符与文件指针的区别
- 文件指针、文件描述符、文件句柄
- 计算:RenderScript
- 软件测试的分类——按测试阶段分类
- java类的成员初始化顺序和初始化块知识
- MVC5 + EF6 入门完整教程 四
- ubuntu下安装QT5.7.1
- 文件描述符与文件指针
- InterruptedException+interrupt停止线程的疑惑
- 【web】HTTP状态返回码介绍,客户端请求服务器端,服务器返回状态码的含义介绍整理。
- delete和truncate的区别
- linux---常用压缩,解压缩命令
- Shell判断字符串包含关系的几种方法
- Dataquest学习总结[4]
- c#学习摘录:类\继承\接口\字段、方法、属性\浅深复制(3)
- 转 matlab卷积函数介绍 conv filter conv2