处理 JFS 目录

目录提供文件系统、链接文件和索引节点子目录名称的层次结构。 对嵌套目录的深度没有任何限制。 磁盘空间上为目录分配 4096 字节的块,但是操作系统分配 512 字节记录的目录空间。

进程可以按常规文件读取目录。 但是,内核可以写入目录。 因此,目录由一组它们特定的子例程创建和维护。

JFS 目录结构

目录包含目录条目序列。 每个目录条目包含三个固定长度的字段(与文件索引节点相关联的索引号、文件名的长度和条目的字节数),以及一个文件名变长字段。 文件名字段以 null 结束,并被填充为 4 字节。 文件名最长可以为 255 字节。

目录条目长度可变,以使得文件名具有最大的灵活性。 然而,任何时候都分配全部目录空间。

没有任何目录条目可以超过目录的 512 字节区域。 当目录需要多于 512 字节时,另一个 512 字节的记录被追加到原始记录。 如果所分配数据块中的所有 512 字节记录均被填充,将分配一个附加的数据块(4096 字节)。

文件被除去时,文件在目录结构中占有的空格被添加到前面的目录条目。 有关所除去目录的信息保留,直到新的条目填充空出的空间。

每个目录都包含条目 .(点) (点)和 .. 和 ..(点,点)。 这个 (点) 目录条目指向目录本身的索引节点。 那 ... (点,点) 目录条目指向父目录的索引节点。 mkfs 程序初始化文件系统,以便(点)和 .. 新根目录中的 (点,点) 条目指向文件系统的根索引节点。

目录具有下列访问方式:

方式 描述
READ 允许进程读目录条目
WRITE 允许进程使用 creatmknod来创建新的目录条目或除去旧的目录条目。 linkunlink 子例程
执行 允许进程将目录用作当前工作目录,或者在目录下的文件树中进行搜索

使用 JFS 目录 (编程)

下列是可用于处理目录的子例程的列表:
关闭目录
关闭目录流并释放与 DirectoryPointer 参数关联的结构
mkdir
创建目录
opendir
打开由 DirectoryName 参数指定的目录并使一个目录流与其关联
readdir
返回指向下一个目录条目的指针
rewinddir
复位指定目录流的位置至目录的开始处
rmdir
除去目录
种子目录
设置下一次 readdir 子例程操作在目录流上的位置
telldir
返回与指定目录流关联的当前位置

更改进程的当前目录

系统引导时,第一个进程将根文件系统的根目录用作其当前目录。 使用 fork 子例程创建的新进程继承父进程使用的当前目录。 chdir 子例程更改进程的当前目录。

chdir 子例程对路径名进行语法分析,以确保目标文件是一个目录并且进程所有者对目录具有许可权。 chdir 子例程运行之后,进程使用新的当前目录搜索所有不以 /(斜杠)开头的路径名。

更改进程的根目录

可以使用 chroot 子例程使进程 Path 参数指定的目录成为有效的根目录。 呼叫进程的子进程将由 chroot 子例程指示的目录视为文件系统的逻辑根目录。

进程为所有以 /(斜杠)开始的路径名使用全局文件系统根目录。 所有以 /(斜杠)开头的路径名搜索从此新的根目录开始。

控制 JFS 目录的子例程

由于目录文件的唯一本性,目录由一个特殊系列的子例程进行控制。 下列子例程设计用于控制目录:

chdir
更改当前工作目录
chroot
更改有效根目录
getcwdgetwd
获取至当前目录的路径
mkdir
创建目录
opendir readdir telldirseekdir rewinddir closedir
对目录执行各种操作
rename
重命名目录
rmdir
除去目录