文件系统内部结构(11)

13.4.12  "Create(创建)"系统调用

该系统调用语法如下:

fd=Create(pathname, permission),其中:

fd表示文件描述符。pathname表示要创建的文件的路径名。permission表示授予对该文件的访问权限。

为了执行该系统调用,内核解析路径名,通过执行前面介绍的路径名解析过程查找文件是否已经存在。如果该文件不存在,就创建该文件。如果该文件存在,那么截断该文件,释放该文件的全部数据块,并将文件大小设为0。从本质上讲,这个过程意味着内核创建具有相同文件名的文件。因此,要在相同目录中删除旧文件并创建新文件。内核按照以下步骤进行:

(1) 内核解析不同目录下的路径名,直到找到最终的文件名为止。内核为该目录保存索引节点(也就是在文件创建的目录),还包括文件名在内。

(2) 内核访问该目录的索引节点,并检查创建进程的用户类别对应的rwx位,确保进程可以向"目录"文件写内容,因为目录中新文件的创建会针对该目录创建或写入一个条目。如果没有访问权限,内核弹出错误消息并退出。

(3) 如果进程有访问权限,内核就按照分配给"目录文件"的数据块读取目录内容,目录文件由内核通过该目录文件的索引节点得到。

(4) 然后,内核搜索该目录中的文件名,检查是否有该文件。如果有,就进入以下步骤:

① 从目录中获取该文件的索引节点号。

② 获取文件的索引节点。

③ 将文件大小设为0(可以采用一种分配给该文件几个块(例如2个块),而不是分配0块的实现方式)。

遍历分配给该文件的所有直接块和间接块,并在这些块空闲的时候释放它们,将其添加到空闲块链表中。

进入步骤6(也就是跳过步骤5)。

(5) 如果文件名已经不存在,它会经历以下步骤:

① 搜索目录中空闲的条目,并将文件名存在其中。

② 从超级块提供的空闲索引节点列表中分配一个空闲索引节点,并解除它和空闲链表的链接。

③ 在目录文件中,按照步骤(1)中得到的空闲条目中文件名设置索引节点号。

(6) 内核在将索引节点写回到磁盘之前为该文件初始化索引节点条目中的各个字段。这个初始化工作按照以下内容完成:

所有者(Owner):创建者的用户名--从创建它的进程u区得到的

组Id(Group id):由u区得到的组id

类型(Type):普通文件(其他文件类型的系统调用格式不同)

权限(Permissions):由参数得到

创建的日期与时间(Date & time of creation):系统日期

其他日期(Other dates):空白

大小(Size):0

地址(Addresses):空白

在创建的时候,内核可以采用为文件分配一定数量的块(例如2个块)的UNIX实现方式。这种情况下,内核调用块分配算法,合理设置索引节点中直接块号条目和文件大小。

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