文件描述符表、文件表、索引节点表
文件描述符:用于内核访问文件,打开或者新建文件时,会返回一个文件描述符,内核使用文件描述符访问文件
分配原则:最小分配
取值范围:非负整数,0~MAX-1 其中默认是0、1、2用于系统标准输入、标准输出、标准错误
系统调用open
系统调用open是进程要存取一个文件中的数据所必须采取的第一步,因为只有通过系统调用open才能返回对应的文件描述符。文件描述符标志特定进程正在访问的文件。每运行一个进程,内核会默认为其打开三个进程描述符,0:标准输入,1:标准输出,2:标准错误。
fd=open(pathname,flags,modes);
例如
int fd = open("/Users/hupac/Public/k.c", 0666, O_RDWR);
其中pathname为路径名,0666为访问权限,O_RDWR给出文件的访问许可权,这里是仅读写。由代码可见,open系统调用返回的整数称为文件描述符。其他与文件操作相关的系统调用如读read,写write,定位lseek都要使用系统调用open返回的文件描述符。
open系统调用过程:
- 内核用算法namei在文件系统中查找文件名参数。若文件不存在或不允许存取,则返回错误。
- 内核找到内存中的索引节点后,它检查打开文件的许可权,然后为该文件在文件表中分配一个表项,设置引用数+1和文件内部偏移量。
文件表中存放着文件中的字节偏移量和指向文件索引节点的指针。 - 内核分配用户文件描述符表项,将指针指向文件表项。
- 最后返回文件描述符。
每个open调用都导致用户描述符表和内核文件表中分配一个唯一表项,但在内核的内存索引节点表中,对每个文件只有一个表项。