Unix文件与目录(2)

  我们可以把磁盘想象成多个区域的间隔,每个区域都可以成为一个文件系统。每个文件系统都有其各自的其主设备号与次设备号,可以使用宏major与宏minor来读取块特殊文件文件(block special file)与字符特殊文件(character special file)的主、次设备。主设备号是一种虚假设备号(基于/dev目录的文件系统),其次设备号是实际设备号(基于磁盘)。

  文件系统在磁盘中存储形式如图1所示:

磁盘中文件系统存储形式

图1. 磁盘中文件系统存储形式

  其中,文件属性及指向文件中所存储数据的指针存储于i-nodes中,文件名、文件中所存储的数据、该文件所对应的i-node编号存储于data blocks中,数据单独存储。如图2所示:

磁盘中文件存储方式

图2. 磁盘中文件存储形式

  i-node中包含文件类型、文件访问权限、文件大小、指向文件中所存储数据的指针、文件链接数等信息。当使用link函数使得一个文件指向链接至该文件(即两个文件具有相同的i-node值)时,我们称之为硬链接,此时i-node中文件链接数被加1。需要删除文件时,可使用unlink函数将目标路径与文件的链接中断(使该路径文件的i-node值被清空,文件被删除),注意,此时仅有目标路径文件被删除,该文件所对应的i-node中若链接数不为0,则代表有其他文件仍指向该文件,i-node中链接数将减1,其余信息保持不变。当使用symlink函数为目标文件建立符号链接时,将新建一个i-node,文件类型为symbolic link file,文件长度为目标文件名长度,文件数据指针与目标文件i-node中数据指针相同。

  目录文件在文件系统中的存储形式与常规文件类似。目录中所包含的文件名及其i-node值存储在目录文件块中。其存储形式如图3所示:

磁盘中目录文件存储形式

图3. 磁盘中目录文件存储形式

 

  link函数可以在需要的地方为目标文件建立一个硬链接,新的路径只有最后一个文件会被创建(文件路径中所经过的目录文件必须全部存在且具有相关权限)。unlink函数可取消指定文件的硬链接(即删除该文件),若文件所对应的i-node中链接数不为0,则仍保留文件中的属性及数据,仅删除指定路径的文件块(directory block)。由于unlink函数无法判断目标文件类型,当指定文件为字符链接文件(symbolic link file)时,将删除该文件本身,而非文件所链接的对象(即删除类型为symbolic link的文件,中断硬链接)。在删除文件功能上,remove函数与unlink函数具有同等效应。

  使用rename函数可以为目标文件重命名,如果出现重名现象,则重名文件不能同时是(或不是)目录文件,否则原文件将被删除,新文件将被创建。重命名时,不允许将新目录名嵌套在旧目录名下(如原有目录名为dir,更名后目录名为dir/dirt)。

  进行使用lchown、lstat、readlink、remove、rename、unlink函数进行文件操作时,若指定路径为symbolic link文件,则调用时只针对与该文件产生作用,而不对该文件所指向的文件产生作用。当使用其他函数进行文件操作时,会将symbolic link文件解释为其所指向的文件。使用symlink函数可以建立symbolic link文件,使用readlink函数可以读取symbolic link文件本身的信息。

  在Unix操作系统中,所有文件都具有三个时间记录,分别为st_atime(最后一次访问时间)、st_mtime(最后一次修改时间)、st_ctime(最后一次修改i-node时间)。使用utime函数可以修改st_atime和st_mtime,但调用utime函数时,内核会自动将st_ctime保存为函数调用时间(因为utime函数修改了i-node中的内容)。调用u-time函数时,需要进程的有效用户与目标文件的所有者相同(或者进程具有超级用户权限)。如果utime函数中第二个参数(times)为NULL,则访问时间与修改时间被保存为函数调用时间,此时仅要求进程对目标文件具有可写权限(或进程有效用户与目标文件所有者用户相同)。

  使用mkdir文件可新建目录文件,使用rmdir文件可删除空的目录文件(仅包含"."、".."文件)。如果在调用rmdir函数时,该目录已被其他进程打开,且目录链接数已为0,则当目录被关闭后,该函数才会返回。

  与目录读取有关的函数包括opendir、readdir、rewinddir、closedir、telldir、seekdir。其中rewinddir函数将目录中当前条目重置为目录的起点处,telldir函数返回目录中当前条目位置,seekdir函数将目录中当前条目位置设置为指定位置(与seek函数类似)。在进程中,可使用chdir、fchdir更改当前工作目录,getcwd函数可用于读取当前工作目录。

  chroot函数可修改当前进程的根目录至指定目录。当根目录被修改时,该进程仅能访问现有根目录下的文件。关于该函数的进一步用法及解释可以参考维基百科IDM文档库中相关信息

posted @ 2012-05-12 15:20  o0慢节奏0o  阅读(625)  评论(0编辑  收藏  举报