APUE读书笔记(二):文件和目录

第四章 文件和目录

1. 函数stat
stat函数用于返回此命名文件有关的信息结构,我们平时使用的shell命令:ls -l就是调用的stat函数。
stat和lstat函数的区别:
当文件为符号链接时,stat返回所引用的文件信息,即跟随符号连接;而lstat返回的是符号链接本身的信息,即不跟随符号链接。

2. 文件访问权限
实际用户ID:文件所有者
有效用户ID:当前正在使用的
设置用户ID:当使用这个文件时,会获得他所有者的权限
chmod u+s filename:打开设置用户ID位

目录包含两项:文件名+指向各文件的指针(即i节点)
1)ls 读取目录:需要目录的读权限;
2)打开文件:需要文件的相关权限(以只读还是读写方式打开),目录的执行权限(要通过指针找到文件);
3)添加/删除文件:需要目录的写、执行权限。而不需要对文件本身具有权限。

函数access和faccessat
一般情况都是按照文件的有效权限进行测试,而access/faccessat使用实际用户/组ID进行权限测试。
用于按实际用户ID和实际组ID进行访问权限测试。
也就是说,即使我们通过root权限可以用open打开的文件,我们通过access函数也可以查看实际用户不能读的文件。

3. 函数umask
umask其实是屏蔽的功能,设置什么位就是屏蔽什么功能了,例如:
umask 027 的功能就是关闭了组的写功能和其他的全部功能。
如果我们想确保任何用户都能读文件,就将umask设为0

4. 函数chmod
chmod更改的是i节点最近一次被更改的时间。
ls -l 列出的是最后修改文件内容的时间。

5. 粘着位
如果一个可执行文件的这一位被设置了,那么当该程序第一次被执行,并终止的时候,程序正文部分的一个副本会被保存在交换区中,使得下次再执行该程序的时候能够很快的将其加载入内存中。
可是如今的unix系统都配置了虚拟存储系统和快速文件系统,就不需要这种技术了

6. 函数chown
用于更改文件的用户ID和组ID。

7. 文件长度
普通文件的文件长度可以为0。
ls -l filename 命令显示的是文件所占的字节数;
du -s filename 命令显示的是文件占用了多少个字节块(一个字节块是512字节);

通过测试发现有些文件的 du -s 命令显示的字节块数 x 512 之后的总字节数要大于 ls -l 显示的字节数,问什么?
因为如果文件中有指针,ls -l 显示的就是指针的大小,即 ls -l 显示的是当前文件的大小;而 du -s 是所占数据块的总和,包括了这些指针所指向的地址空间。

8. 文件截断
函数:truncate
或者打开文件的时候使用 O_TRUNC标志。

9. 文件系统
i节点包含了文件有关的所有信息:文件类型、文件访问权限位、文件长度和指向文件数据块的指针等。

MV命令原理:当源目录和目标目录是同一个文件系统时,无须修改i节点,只需修改目录项即可。(目录项包含文件名和i节点编号)

每次新建一个目录,如:mkdir testdir后,产生3个链接和1个i节点目录块,分别是:testdir的目录项指向新的i节点、.和..分别指向testdir的i节点和其父目录。

链接为 Linux 系统解决了文件的共享使用,还带来了隐藏文件路径、增加权限安全及节省存储等好处。

而每个i节点里还有一个链接计数,是指向该i节点的目录项数,当计数为0的时候才会在磁盘上删除这个文件。所以:unlink不是delete。
删除文件的确认过程:
1) 打开该文件的进程个数为0;
2) 链接计数为0;
3) 删除文件内容。
前面所说的这种链接是硬链接(hard link),还有一种软链接(symbolic link),软链接的i节点类型是S_IFLNK,所以系统知道这是一个符号链接。

10. 硬链接和软链接对比:
1) 硬链接:不同的目录项指向同一个i节点,文件本身不复制,所有的硬链接都断开之后才会delete文件内容,即释放文件数据块。硬链接是不能跨文件系统的,因为一个目录项不能指向另一个文件系统的i节点,这就是为什么 ln 命令不能跨文件系统的原因;
函数:link
shell:ln 源文件 硬链接
下面是实例:

 // 1.只能对已存在的文件创建硬连接
 # link old.file hard.link 
 link: cannot create link `hard.link' to `old.file': No such file or directory 

 // 2.文件有相同的 inode 号以及 data block 
 # link old.file hard.link | ls -li 
 total 8 
 660650 -rw-r--r-- 2 root root 25 Sep  1 17:44 hard.link 
 660650 -rw-r--r-- 2 root root 25 Sep  1 17:44 old.file 

 // 3.不能交叉文件系统
 # ln /dev/input/event5 /root/bfile.txt 
 ln: failed to create hard link `/root/bfile.txt' => `/dev/input/event5': 
 Invalid cross-device link 

 // 4.不能对目录进行创建硬连接
 # mkdir -p old.dir/test 
 # ln old.dir/ hardlink.dir 
 ln: `old.dir/': hard link not allowed for directory 
 # ls -iF 
 660650 hard.link  657948 old.dir/  660650 old.file

hard link不能对目录创建的原因是:
因为目录项里面有.和..两个目录项,如果对目录link的话会产生死循环。如果是软链接的话我们可以通过unlink消除,因为unlink不跟随符号链接;而如果是硬链接的话就很难消除了。

2) 软链接:又叫符号链接。它就相当于windows中的快捷方式一样,因为软链接有自己的 inode 号以及用户数据块,因此软链接的创建与使用没有类似硬链接的诸多限制:
a. 软链接有自己的文件属性及权限等;
b. 可对不存在的文件或目录创建软链接;
c. 软链接可交叉文件系统;
d. 软链接可对文件或目录创建;
e. 创建软链接时,链接计数 i_nlink 不会增加;
f. 删除软链接并不影响被指向的文件,但若被指向的原文件被删除,则相关软连接被称为死链接,若被指向路径文件被重新创建,死链接可恢复为正常的软链接。

函数:symlink
shell:ln -s 源文件 软链接

11. 临时文件的创建过程:
先创建文件,然后立即unlink,这样当这个函数结束之后就会立即回收这个文件的地址空间了。(就像CreateThreadC之后立即CloseHandle一样)

注意我们在测试书中4-16这个例子的时候,采用的是 df 命令来查看可用磁盘空间,为什么不能用 du 呢?
因为 du 命令需要加 filename,而在 du . 的时候不会计算临时文件的空间,因为已经 unlink 了,可是由于程序中 sleep(15),所以这时临时文件还是占用了磁盘空间的,这个时候我们就要用 df 命令来查看了。(df 的参数是磁盘而不是文件名,如:df /home)

12. 函数rename
可以对文件或目录重命名。

13. 文件的时间
ls 命令默认的显示的是文件最后的修改时间
ls -u 显示文件数据最后的访问时间
ls -c 显示i节点状态最后的更改时间
例如:创建一个新文件影响到包含此新文件的目录,也影响到该新文件的i节点。但是,读或写一个文件只影响该文件的i节点,对目录无影响。
文件的访问和修改时间可硬通过futimens、utimensat和utimes函数更改。

14. 函数chdir
用于更改当前工作目录,即 cd 命令。

15.getcwd原理
用..找到上级目录,然后读取目录项,找到其中i节点号与当前工作目录i节点号相同的目录项,获得对应的文件名(目录项包含文件名+i节点编号)。递归向上,直到遇到根,即可获得完整工作路径。
其实getcwd的应用场合就是:保存当前工作目录,便于返回。而我们可以使用open当前路径的方式,保存返回的fd,这样可以避免pwd的遍历的开销。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值