APUE-文件和目录(四)文件系统
一个命令 mkfs
讲文件系统前先介绍一个用于创建文件系统的命令:
mkfs
mkfs [options] [-t type fs-options] device [size]
描述
mkfs用来在设备上创建一个Linux文件系统,这个设备通常情况下是一个硬盘分区。上面的device参数要么是设备名(例如:/dev/hda1,/dev/sdb2),或者为包含文件系统的一个普通文件。size参数为此文件系统使用的block的数量。
返回值0代表成功,1代表失败。
选项(参数)
- -t --type type
指定将要创建的文件系统的类型。默认为ext2。 - fs-options
用来传递给文件系统生成器的特定选项。下面的选项被大多数文件系统生成器所支持。
-V,--verbose
产生详细输出,包括被执行的所有的文件系统的特定命令的输出。多次(大于一次)指定这个选项会抑制任意文件系统的特定命令的执行。这只在测试的情况下才会用到。
-V, --version
显示版本信息后退出。(选项-V只有在它是唯一参数的情况下才会显示版本信息,否则按照--verbose来工作。)
-h,--help
显示帮助信息
APUE中的文件系统
APUE中讲的是以Berkeley快速文件系统为基础的Unix文件系统。
我们可以把一个磁盘分为一个或多个分区。每个分区都可以包含一个文件系统,参照图4.13。

硬连接
问题:为什么删除一个目录项的函数被称之为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命令和mv命令
ln命令用户创建链接(硬连接和软连接),因为目录项中的i节点编号指向同一文件系统中的相应i节点,一个目录项不能指向另一个文件系统的i节点。因此ln命令(构造一个指向一个现有文件的新目录项)不能跨文件系统。
在不跨文件系统为一个文件重命名时,该文件的实际内容并未移动,只需要构造一个指向现有i节点的新目录项,并删除老的目录项。链接计数不会变。这是mv(1)命令的通常操作方式。
目录文件的链接计数

假设我们创建了一个新目录
$mkdir testdir
图4-15显示结果。该图显示的显示了.和..目录项。图中显示了两个i节点:
- 编号为2549的i节点,其字段类型表示这是一个目录,链接计数为2。任何一个页目录(不包含任何目录的目录)的链接计数总是2,它来自命名该目录的目录项以及在该目录中的.项。
- 编号为1267的i节点,其字段类型表示它是一个目录,链接计数大于等于3。因为至少有三个目录项指向它,一个是命名它的目录项(图中没有显示),第二个是在该目录中的.项,第三个是在子目录testdir中的..项。
注意: 在父目录中的每一个子目录都使该父目录的链接计数增加1。
函数link、linkat、unlink、unlinkat和remove
创建一个文件链接
任何一个文件可以有多个目录项指向其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
什么情况下才会删除一个文件的内容
- 使用unlink函数会将pathname所引用文件的链接计数减1。如果对该文件还有其他链接,则仍可通过其他文件访问该文件的数据。如果出错,则不对该文件做任何更改。
- 使用unlink函数解除一个文件的链接,必须对包含该目录项的目录具有写和执行权限,此外,如果对该目录设置了粘着位,还需要具备下面三个条件之一:
- 拥有该文件;
- 拥有该目录;
- 具有超级用户权限。
- 检查链接计数之前,内核会检查打开该文件的进程个数,如果进程数为0才会去检查链接计数,如果计数也是0,那么就会删除该文件的内容。
APUE-文件和目录(四)文件系统的更多相关文章
- [APUE]文件和目录(下)
一.mkdir和rmdir函数 #include <sys/types.h> #include <sys/stat.h> int mkdir(const char *pathn ...
- [APUE]文件和目录(中)
一.link.unlink.remove和rename 一个文件可以有多个目录项指向其i节点.使用link函数可以创建一个指向现存文件连接 #include <unistd.h> int ...
- [APUE]文件和目录(上)
一.文件权限 1. 各种ID 我在读这一章时遇到了各种ID,根据名字完全不清楚什么意思,幸好看到了这篇文章,http://blog.csdn.net/ccjjnn19890720/article/de ...
- APUE 文件和目录
文件和目录 Unix 所有的文件都对应一个 struct stat,包含了一个文件所有的信息. #include <sys/stat.h> struct stat { mode_t st_ ...
- APUE ☞ 文件和目录
粘着位(Sticky Bit) S_ISVTX位被称为粘着位.如果一个可执行程序文件的这一位被设置了,程序第一次运行完之后,程序的正文部分的一个副本仍被保存在交换区(程序的正文部分是机器指令).这使得 ...
- (三) 一起学 Unix 环境高级编程 (APUE) 之 文件和目录
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
- 《UNIX环境高级编程》笔记——4.文件和目录
一.引言 本章描述文件系统的其他特征和文件的性质.有些背景知识需要注意,例如用户ID与文件权限.文件系统等. 二.函数stat.fstat.fstatat和lstat #include <sys ...
- Linux学习-文件和目录管理
Linux文件和目录管理 文件系统架构 1.Linux文件系统具有层级性 1)文件或者目录起始于根目录"/"成为树状结构 2)最顶层由/开始 2 ...
- apue学习笔记(第四章 文件和目录)
本章将描述文件系统的其他特性和文件的性质. 函数stat.fstat.fstatat和lstat #include <sys/stat.h> int stat(const char *re ...
- 《UNIX环境高级编程》(APUE) 笔记第四章 - 文件和目录
4 - 文件和目录 1. 函数 stat.fstat.fstatat 和 lstat #inlcude <sys/stat.h> int stat(const char *restrict ...
随机推荐
- 业务订单号生成算法,每秒50W左右,不同机器保证不重复,包含日期可读性好
参考snowflace算法,基本思路: 序列12位(更格式化的输出后,性能损耗导致每毫秒生成不了这么多,所以可以考虑减少这里的位,不过留着也并无影响) 机器位10位 毫秒为左移 22位 上述几个做或运 ...
- Vue 普通对象数据更新与 file 对象数据更新
最近在做一个多图片上传的组件,需求是做到多文件依次上传,并显示上传进度条. 逻辑部分实现了以后,在更新进度条视图的时候出现一点问题:动态计算生产的进度 progress 属性不会自动更新. 原来的代码 ...
- .net之简单工厂模式
//抽象一个生产笔的方法 namespace simpleFactory{ public abstract class AbstractPen { public abstract void creat ...
- 人生苦短,我用Python
Life is short, You need Python. 工作中常常要用到脚本来完成许多重复性的工作,刚开始是查数据库的时候,也曾用shell 来写脚本,但终于还是觉得shell太艰涩, 一行命 ...
- centeOS6.5 RPM方式安装MySQL5.6
RPM方式安装MySQL5.6 a. 检查MySQL及相关RPM包,是否安装,如果有安装,则移除(rpm –e 名称) 1 [root@localhost ~]# rpm -qa | grep -i ...
- SQL Server中关于基数估计如何计算预估行数的一些探讨
关于SQL Server 2014中的基数估计,官方文档Optimizing Your Query Plans with the SQL Server 2014 Cardinality Estimat ...
- poj3261 Milk Patterns 后缀数组求可重叠的k次最长重复子串
题目链接:http://poj.org/problem?id=3261 思路: 后缀数组的很好的一道入门题目 先利用模板求出sa数组和height数组 然后二分答案(即对于可能出现的重复长度进行二分) ...
- 最新合购网源码net.asp程序 彩票合买功能采用全新内核、全新架构,更小巧、功能更强、更快、更安全稳定
合买代购功能 可购彩种:福彩3D.排列3.重庆时时彩.天津时时彩.广东11选5.11运夺金.江苏快3.广西快3.拥有上百种玩法,更多彩种即将开发完成,更多的彩种不断开发更新中... 选号投注:建立追号 ...
- 转:Redis 配置为 Service 系统服务
在Linux中,将程序配置为服务后,就可以使用service命令对系统服务进行管理,如:start(启动).stop(停止).restart(重启)等.Redis安装后默认不会配置为系统服务,本文将介 ...
- OOP 三大特点:继承性,封装性,多态性
1.继承性:代码重用 2.封装性: 使相似数据和操作进行封装,保持代码安全 3.多态性: PHP不支持多态