文件系统内部结构(6)

13.4.7  "Open(打开)"系统调用

当进程想要对文件执行任一操作时,它先要打开文件。该系统调用格式如下:

fd = Open (pathname, mode, flags, permissions),其中:

fd(文件描述符),表示文件描述符。pathname(路径名)表示要打开的文件的路径名。mode(模式)指的是打开文件的模式(例如,读、写)。flag(标识)表示指明创建文件的指示符(如果该文件不存在)或是产生的错误。permissions(权限)指的是如果创建文件,分配给该文件的访问权限。

"fd"指的是前面提到的在UFDT表中的文件描述符条目号。"open"系统调用在UFDT中生成条目。UFDT条目号或"fd"是由"open"系统调用返回的,以备将来使用。对所有文件进行读、写、查找或关闭这样进一步的操作时,都要指明这个"fd"。这样,内核可以将其作为UFDT的索引使用,从而遍历FT和IT数据结构。

路径名、模式等是打开系统调用时的输入参数。内核在"打开"文件时,执行以下动作:

(1) 内核解析由其中一个参数指定的路径名。如果路径名不存在,内核检查参数中的标识。如果不是创建新文件,内核就输出错误消息并退出。否则,它调用系统调用创建该文件。该系统调用会为新文件分配索引节点,并初始化索引节点的各个字段。这种情况下,它根据"permissions"参数在打开前设置要创建的文件的索引节点中存取控制位(rwx)。最终,内核检索到要打开的文件在磁盘上的索引节点号,而不管文件在创建前就已经存在或是需要创建。

(2) 内核在内存IT条目中搜索该索引节点,如图13-21所示。如果没有找到(如果正在创建新文件,或是第一次打开这个文件,就会这样),那么将磁盘上这个索引节点复制到IT条目中。这是在获取核心IT表中空闲索引节点以及将其从该表空闲条目链表中解除链接后完成的。

(3) 内核现在为该文件检查核心索引节点中的权限位。它验证想要打开文件的进程是否可以按照期望的模式处理(如果进程在"打开"的时候系统正在创建这个文件,必然是允许访问的)。如果拒绝访问,那么内核就输出错误消息并退出。

(4) 如果同意访问,而且如果对应索引节点的核心IT条目之前并不存在,那么内核就会初始化该索引节点在IT中的其他字段,如表13-2所示。

(5) 现在内核得到空闲的FT条目,将其从FT中空闲条目链表中解除链接,并设置获取的FT条目中如下字段:

模式(mode):从系统调用参数获取模式。

偏移量(offset):通常该值是0。这样,读/写可以从开始的位置进行。然而,如果文件是用"写-附加"模式打开的,该字段就被设为文件大小,这样任何要写入文件的内容就会附加到文件中。

计数(Count):1

指针(Pointer):该指针指向索引节点的IT条目。

(f) 现在得到UFDT中的下一个空闲条目,UFDT是打开文件的进程u区的一部分。因此,这个表格在创建进程之后就已经存在了。这个"下一个空闲条目"被称作"文件描述符(fd)"。内核存储"fd"并生成一个由UFDT条目指向FT中条目的指针。

(g) 内核将"fd"返回给该进程。

如果同一个进程用两种模式打开同一个文件:一个是读模式,另一个是写模式,那么算法几乎相同。这是因为,在这种情况下,核心索引节点已经存在,因此,不需要再从磁盘复制过来。算法可以保证这一点。此时,有两个UFDT条目,它们分别指向FT中两个不同的条目,但这两个FT只指向IT条目中唯一的条目,如图13-21所示。

posted @ 2012-03-17 22:46  CobbLiu  阅读(277)  评论(0编辑  收藏  举报