linux系统中的文件由索引节点和数据块两部分组成。(文件名:目录)inode保存了文件属性等相关信息。
5.1 获取文件属性
系统调用stat/fstat/lstat用于获取文件索引节点中的属性信息并保存在结构体stat中。
stat数据结构定义如下:
实际文件大小小于off_tst_size,因为空洞。一般情况下,一个磁盘块是512字节,如果一个文件包含空洞,则系统并不会给空洞部分分配磁盘块,所以这样的文件所分配的磁盘块数小于其文件长度/512。
系统调用stat,fstat,lstat功能类似,都是获取指定文件的属性并保存在一个stat类型的结构体buf中。区别在于:fstat在使用前,需要使用open打开该文件并得到该文件的文件描述符,而stat和lstat不需要打开文件,因此减少了I/O操作;lstat专门用于获取符号链接文件本身的属性,符号链接是linux系统中的一种快捷方式,用于指向一个目标文件,所有对符号链接文件的操作都会转移到其所链接的目标文件上;stat对一个符号链接文件执行时,获取的是该符号链接文件的目标文件的属性而不是符号链接文件的属性。
5.1.1 判断文件类型
判断文件的类型要使用stat结构体中的st_mode成员。
方法一:
通过调用linux系统定义的类型判断宏,当被判断的文件是该类型时,该宏返回1,否则返回0。
方法二:
检查st_mode的高四位,将st_mode与文件权限掩码S_IFMT进行与操作。
5.1.2 判断文件权限
5.1.3 判断setuid,setgid,sticky权限
1. setuid位
给予访问某文件的普通用户(实际用户)以root权限(有效用户)。
2. setgid位
3. sticky位
5.2 用户/组ID与名字的转换
/etc/passwd这个文件中保存着系统账户信息,其格式为:
用户名:密码;UID;GID;主目录;shell
可以看出,pw_name就是我们要找的用户名信息。
5.3 硬连接与符号链接
5.4 dup/dup2
5.4.1 输入/输出重定向
执行一个shell命令行程序时通常会自动打开3个标准文件,即标准输入文件(stdin),对应终端的键盘;标准输出文件(stdout)和标准错误输出文件(stderr),这两个文件对应终端的屏幕。
以cat命令为例,不带参数的cat命令会从标准输入文件中读取数据,并将其送到标准输出文件。
#cat
hello
hello
world
world
ctrl+D结束。
输入输出重定向是将命令或可执行程序的标准输入输出重定向到指定文件中。
</>:覆盖原文件内容;
<</>>:追加内容。
例如:
dup(3):将文件描述符3复制到当前最小可用的文件描述符。
dup2(3,1):关闭1文件,将3复制到1。