文件描述符与文件指针

来源:互联网 发布:网络恐怖主义的成因 编辑:程序博客网 时间: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

0 0