1、目录项和inode
一个文件主要由两部分组成:
- dentry,目录项,包括文件名和inode号
- inode:本质结构体;存储文件的属性信息,如:权限、类型、大小、时间、用户、盘快位置()…也叫做文件属性管理结构,大多数的inode都存储在磁盘上。(少量常用、近期使用的inode会被缓存到内存中)
给文件创建硬链接:
- inode是一样的,但是目录项是不一样的
删除文件:
- 就是删除inode,去掉一个目录项,但是数据其实还是在硬盘上,以后会覆盖掉。
2、stat、lstat函数
查看文件信息:
stat 文件名
stat结构体:
/*
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
lstat:获取软链接文件的信息,没有穿透作用
stat:获取文件信息,有穿透作用(不会获得软链接文件信息,直接获得源文件信息);
int stat(const char *pathname, struct stat *statbuf);
作用:获取一个文件相关的一些信息
参数:
- pathname:操作的文件的路径
- statbuf:结构体变量,传出参数,用于保存获取到的文件的信息
返回值:
成功:返回0
失败:返回-1 设置errno
int lstat(const char *pathname, struct stat *statbuf);
参数:
- pathname:操作的文件的路径
- statbuf:结构体变量,传出参数,用于保存获取到的文件的信息
返回值:
成功:返回0
失败:返回-1 设置errno
*/
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
int main() {
struct stat statbuf;
int ret = stat("a.txt", &statbuf);
if(ret == -1) {
perror("stat");
return -1;
}
printf("size: %ld\n", statbuf.st_size);
return 0;
}
st_mode
注意: 图片中的宏值都为8进制数
文件权限: User,Group,Others:rwx用1 (有) 或0 (无) 填充;
文件类型(对应12-15标志位):
以套接字为例:0140000(八进制),转换为二进制(1100 0000 0000 0000),看前4位1100,表示的就是管道文件;
判断Others是否有可执行(x)的权限:
st_mode:我们会得到16位的 二进制数,将前面15位变成0,和宏值做与操作
判断文件类型:不是与操作,它是多个为=位:
比如判断套接字文件:1100 0000 0000 0000,将后面12位全部变成0;和掩码S_IFMT (八进制:0170000,二进制:1111 0000 0000 0000) 与操作,得到值和八进制值进行对比