🎈3. stat函数实例分析及stat命令
下面通过一个实例来演示一下stat函数的使用方法。测试函数如下
/************************************************************ >File Name : getstat.c >Author : QQ >Company : QQ >Create Time: 2022年05月14日 星期六 18时37分17秒 ************************************************************/ #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> int main(int argc, char* argv[]) { if(argc < 2) { printf("not found filename\n"); return -1; } struct stat m_status; stat(argv[1], &m_status); return 0; }
我们可以借助gdb调试器来查看结构体内容,并且借助gdb强大的功能可以很优美的打印出结构体内容。
我们使用set来设置一下,优美的打印结构体
该文件的硬链接数为st_nlink=2,我们确实对该文件创建了硬链接
我们可以看到这里面有一个st_mode=33188,这个就是我们在介绍stat结构体时重点介绍的权限参数,但是这里是十进制显示的,我们可以把它的八进制形式在gdb中打印出来
我们通过这个8进制数和文件类型掩码、权限掩码分别相与就可以得到这个文件的文件类型以及各用户的权限。
S_IFMT & 0100644 = 0100000 ===> S_IFREG 0100000
可以看到相与之后的值对应于S_IFREG,也就是说这是个普通文件。
继续往下看 st_uid=0,st_gid=0,这个对应的是用户及组ID,这里要说明的是,我当前使用的是root用户,相应用户的ID可以在 /etc/passwd 中查看,我们可以使用vim编辑器打开文件查看
vim /etc/passwd
在第一行就可以看到root,后面两个0就对应结构体中的 st_uid=0和st_gid=0 。
继续往下看st_size = 11表示文件大小,可以通过ll命令来验证一下
再后面是块大小st_blksize = 4096和块的个数st_blocks = 8,那么每个块的大小是512,实际上这两个内容就是记录有多少个512大小的块。
再后面就是三个时间结构体的信息,最近访问时间、最近更改时间、最近状态改动时间。
- Access 最近访问时间:是指最近的一次访问(读/写等),比如使用cat、touch等命令访问了该文件(访问但是没有修改),那么最近访问时间就会更新;
- Modify 最近更改时间:是指最近一次文件内容的更改时间;
- Change 最近状态改动时间:是指最近一次文件属性的更改时间,文件属性的更改包括文件大小、硬链接计数、文件权限等等的修改,并且一般Modify发生改变的时候,Change也会随之变化,因为文件内容的修改一般都会涉及到文件大小等的变化;
如果我们只是用cat查看一下文件,那么只有Access时间会更新;如果我们只是修改文件的权限,比如增加可执行权限,那么只有Change时间更新;如果我们使用重定向往文件中写入内容,那么Modify和Change时间会更新,而Access时间不会更新,因为在重定向的过程中,并没有访问文件。
实际上,上面介绍的这些内容,直接通过stat命令就可以查看