UNIX系统文件系统与杂项例程详解
1. 文件系统操作
文件系统操作在很多方面与之前的示例类似,但存在一些关键差异。在getsblock例程中,使用bread函数读取超级块,而非直接操作,因为超级块的位置以磁盘块号定义,而非字节地址。在getinodes例程中,itod宏返回文件系统块号,再通过fsbtodb宏转换为磁盘块号。文件系统块大小通常是4096字节的倍数,而磁盘块一般为512字节。调用bread时,使用超级块结构的fs_bsize元素,以适应不同文件系统的块大小差异。在bread中,使用dtob宏将磁盘块号转换为字节偏移量。
1.1 从文件系统读取数据块
多数情况下,磁盘i节点结构中的信息足以完成任务,但有时需要读取文件的数据块,如备份程序。文件数据块的地址存储在dinode结构中,前几个是直接地址,可直接通过bread读取;接下来是单间接块、双间接块和三间接块,需要逐步读取和处理。
以下是读取数据块的代码示例:
read_blocks(dp) struct dinode *dp; { int count; register int i, n; char dblock[MAXBSIZE