文件的基本操作
创建文件
删除文件
在这里我们可以看到,删除文件这个系统调用也是需要用文件名去目录表中寻找文件的
打开文件
当用户对一个文件实施多次读/写等操作时,每次都要从检索目录开始.为了避免多次重复地检索目录,大多数操作系统要求,当用户首次对某文件发出操作请求时,须先利用系统调用open将该文件打开.系统维护一个包含所有打开文件信息的表,称为打开文件表.所谓“打开”,是指系统检索到指定文件的目录项后,将该目录项从外存复制到内存中的打开文件表的一个表目中,并将该表目的索引号(也称文件描述符)返回给用户.当用户再次对该文件发出操作请求时,可通过文件描述符在打开文件表中查找到文件信息,从而节省了大量的检索开销.当文件不再使用时,可利用系统调用Close关闭它,则系统将会从打开文件表中删除这一表目。
注意当仅使用open系统调用时,仅仅是将该文件的FCB调入到了打开文件表中,并没有将文件的数据从外存读入内存。那是read系统调用要干的事情
在多个进程可以同时打开文件的操作系统中,通常采用两级表:整个系统表和每个进程表.整个系统的打开文件表包含与进程无关的信息,如文件在磁盘上的位置、访问日期和文件大小.每个进程的打开文件表保存的是进程对文件的使用信息,如文件的当前读写指针、文件访问权限并包含指向系统表中适当条目的指针.一旦有进程打开了一个文件,系统表就包含该文件的条目.当另一个进程执行调用打开时,只不过是在其打开文件表中增加一个条目,并指向系统表的相应条目.通常,系统打开文件表为每个文件关联一个打开计数器(Open Count),以记录多少进程打开了该文件.当文件不再使用时,利用系统调用Close关闭它,会删除单个进程的打开文件表中的相应条目,系统表中的相应打开计数器也会递减.当打开计数器为0时,表示该文件不再被使用,并且可从系统表中删除相应条目.图4.3展示了这种结构。
文件名不必是打开文件表的一部分,因为一旦完成对 FCB 在磁盘上的定位,系统就不再使用文件名。对于访问打开文件表的索引号,UNIX称之为文件描述符,而 Windows 称之为文件句柄。因此,只要文件未被关闭,所有文件操作都是通过文件描述符(不是文件名)来进行。
只要完成了文件打开 open()系统调用,后面再使用 read()、write()、Lseek()、close()等文件操作的系统调用,就不再使用文件名,而使用文件描述符。该考点已反复考过多次。
每个打开文件都具有如下关联信息:
- 文件指针。系统跟踪上次的读写位置作为当前文件位置的指针,这种指针对打开文件的某个进程来说是唯一的,因此必须与磁盘文件属性分开保存。
- 文件打开计数。计数器跟踪当前文件打开和关闭的数量。因为多个进程可能打开同一个文件,所以系统在删除打开文件条目之前,必须等待最后一个进程关闭文件。
- 文件磁盘位置。大多数文件操作要求系统修改文件数据。查找磁盘上的文件所需的信息保存在内存中,以便系统不必为每个操作都从磁盘上读取该信息。
- 访问权限。每个进程打开文件都需要有一个访问模式(创建、只读、读写、添加等)。该信息保存在进程的打开文件表中,以便操作系统能够允许或拒绝后续的 IO 请求。