讲文件系统前先介绍一个用于建立文件系统的命令:
mkfs数据库
mkfs [options] [-t type fs-options] device [size]
描述
mkfs用来在设备上建立一个Linux文件系统,这个设备一般状况下是一个硬盘分区。上面的device参数要么是设备名(例如:/dev/hda1,/dev/sdb2),或者为包含文件系统的一个普通文件。size参数为此文件系统使用的block的数量。函数
返回值0表明成功,1表明失败。测试
选项(参数)指针
-V,--verbosecode
产生详细输出,包括被执行的全部的文件系统的特定命令的输出。屡次(大于一次)指定这个选项会抑制任意文件系统的特定命令的执行。这只在测试的状况下才会用到。
-V, --version进程
显示版本信息后退出。(选项-V只有在它是惟一参数的状况下才会显示版本信息,不然按照--verbose来工做。)rem
-h,--help
显示帮助信息字符串
APUE中讲的是以Berkeley快速文件系统为基础的Unix文件系统。io
咱们能够把一个磁盘分为一个或多个分区。每一个分区均可以包含一个文件系统,参照图4.13。test
问题:为何删除一个目录项的函数被称之为unlink而不叫作delete。
i节点是固定长度的记录项,它包含有关文件的大部分信息。图4-14中的两个目录项指向同一个i节点。每一个i 节点都有一个连接计数,其值是指向该i节点的目录项数。只有当连接计数减小至0时,才可删除该文件(也就是能够释放该文件占用的数据块)。这就是为何删除一个目录项被称做unlink的缘由。在stat结构中,连接计数包含在st_nlink成员中,其基本系统数据类型是nlink_t。这种类型称为硬链接。
符号连接文件的实际内容包含了该符号连接所指向的文件的名字。看下面的例子:
lrwxrwxrwx 1 root 7 Sep 25 07:14 lib -> usr/lib
目录项中的文件名是3个字符的字符串lib,而在该文件中包含了7个字节的数据usr/lib。该i节点的文件类型是S_IFLINK,因而系统知道这是一个符号连接。
i节点包含了文件有关的全部信息:文件类型、文件访问权限、文件长度和指向文件数据库的指针等。stat结构中的大多数信息都取自i节点。只有两项重要数据存放在目录项中:文件名和i节点编号。i节点标号的数据类型为ino_t。
ln命令用户建立连接(硬链接和软链接),由于目录项中的i节点编号指向同一文件系统中的相应i节点,一个目录项不能指向另外一个文件系统的i节点。所以ln命令(构造一个指向一个现有文件的新目录项)不能跨文件系统。
在不跨文件系统为一个文件重命名时,该文件的实际内容并未移动,只须要构造一个指向现有i节点的新目录项,并删除老的目录项。连接计数不会变。这是mv(1)命令的一般操做方式。
假设咱们建立了一个新目录
$mkdir testdir
图4-15显示结果。该图显示的显示了.和..目录项。图中显示了两个i节点:
任何一个文件能够有多个目录项指向其i节点。建立一个指向现有文件的连接的方法是使用link函数或者linkat函数。
#include <unistd.h> int link(const char*existingpath,const char *newpath); int linkat(int efd,const char*existingpath,int fd,const char*newpath,int flag); 成功返回0;出错返回-1
这两个函数建立一个新目录项newpath,它引用现有文件existingpath。若是newpath已经存在,则返回出错。只建立newpath中的最后一个份量,路径中的其余部分应该已经存在。
为了删除一个现有的目录项,能够调用unlink函数。
#include <unistd.h> int unlink(const char*pathname); int unlinkat(int fd,const char*pathname,int flag); 成功返回0,出错返回-1
什么状况下才会删除一个文件的内容