文件描述符(fd)
对于linux而言,所有对设备(对于linux而言,一切皆文件)和文件的操作都使用文件描述符来进行的。
文件描述符是一个非负的整数,它是一个索引值,指向内核中每个进程打开文件的记录表。
当打开一个现存文件或创建一个新文件时,内核就向进程返回一个文件描述符用于后续对文件的读写操作;当需要读写文件时,也需要把文件描述符作为参数传递给相应的函数。
通常情况下,将一个程序从硬盘加载到内存后,这个程序就化身为了一个进程,这时系统会默认打开三个文件:
标准输入(stdin)、标准输出(stdout)、标准错误(stderr)。
这三个文件相对应的三个文件描述符分别为0、1、2。所以后面如果创建新文件,那么此时这个新文件的文件描述符就是3啦。。。
这是因为在Linux中,文件的描述符分配是从小到大逐个查询文件描述符是否已经使用,然后再分配。
相应的,如果你提前关闭了文件描述符1,那么新建的文件的描述符就是1。
一个进程的文件描述符与对应的文件的关系简图:
FILE结构体
1.先来看看FILE结构体的定义:
FILE结构体中最重要的两个成员变量是:
文件描述符和缓冲区的大小
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
FILE结构体与文件描述符之间的关系图示:
对上图内容的简要介绍:
1.进程打开一个文件的过程:
进程通过系统调用open()来打开一个文件,实质上是获得一个文件描述符,以便于进程通过文件描述符来读写该文件、
进程打开文件时,会为该文件创建一个file对象,并将一个指向该file对象的指针存入进程描述符表(进程描述符数组),进而确定了打开文件的文件描述符(数组下标)。open()系统调用是在内核里通过sys_open()实现的,
sys_open()将创建文件的dentry、inode和file对象。
创建file对象时,将file对象f_op指向了所属文件系统的操作函数集file_operations
,而该函数集又来自具体文件的i节点,于是虚拟文件系统就与实际文件系统的操作就衔接起来了。并在file_struct结构体的进程打开文件表fd_array[NR_OPEN_DEFAULT]中查找一个空闲表项(也就是此时数组中最小的未被占用的表项),然后返回该表项的下标(文件描述符)。
2.上述描述中提到的结构体的定义:
描述符数组存放在进程打开的文件表files_struct结构中。
文件描述符数组中存放了一个进程所打开的所有文件.
files_struct结构体定义:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
file结构体:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
file结构体的几个重要的成员变量:
f_flags:表示打开文件的权限 。
f_pos:表示当前读写文件的位置。
f_count:表示打开文件的引用计数,如果有多个文件指针指向它,就会增加f_count的值。
f_mode:设置对文件的访问模式,例如:只读,只写、可读可写等。
③file_operations结构体:
file结构体中的f_op指针指向file_operations结构体,这个结构体中的成员除了struct module* owner 其余都是函数指针。
file_operation就是把系统调用和驱动程序关联起来的关键数据结构。
这个结构的每一个成员都对应着一个系统调用。
读取file_operation中相应的函数指针,接着把控制权转交给函数,从而完成了Linux设备驱动程序的工作。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
小结:
file_struct是操作系统用来管理文件的数据结构,
当我们创建一个进程时,会创建文件描述符表,
进程控制块PCB中的fs指针指向文件描述符表,
当我们创建文件时,会为指向该文件的指针FILE*关联一个文件描述符并添加在文件描述符表中。
在文件描述符表中fd相当于数组的索引,FILE*相当于数组的内容,指向一个文件结构体。
转载出处:http://blog.csdn.net/qq_34992845/article/details/71446333