文件系统:
inode:
命令: stat 文件名 查看文件 inode结点
本质为结构体,存储文件的属性信息 如 权限、类型 大小、盘块位置 大多数inode存在磁盘上
少量常用。近期使用的inode 会被缓存到内存中
dentry
目录项,本质依然是结构体,重要成员变量有两个 {文件名 ,inode...}
文件内容保存在磁盘块中
stat:函数(获取文件属性 从 inode结点中获取)
int stat(const char *path, struct stat *buf);
参数:
path: 文件路径
buf (传出参数)存放文件属性
返回值:
成功:0
失败:-1 errno
获取文件大小: buf.st_size
获取文件类型:buf.st_mode
获取文件权限:buf.st_mode
S_ISREG(buf.st_mode) is it a regular file?
S_ISDIR(m) directory?
S_ISCHR(m) character device?
S_ISBLK(m) block device?
S_ISFIFO(m) FIFO (named pipe)?
S_ISLNK(m) symbolic link? (Not in POSIX.1-1996.)
S_ISSOCK(m) socket? (Not in POSIX.1-1996.)
符号穿透: stat 会 lstat 不会
用stat函数去查看软连接类型时 ,会显示源文件的类型
link/unlink函数:
为已经存在的文件创建目录项(硬链接)
int link(const char *oldpath, const char *newpath);
删除一个文件的目录项
int unlink(const char *pathname);
注意:linux 下删除文件机制:不断将 st_nlink -1, 直至减为 0 。无目录项对应的文件,将会被操作系统择机释放(具体时间有系统内部调度算法决定)
因此,我们删除文件,从某种意义上说 ,只是让文件具备了被释放条件。
unlink 函数的特征:清除文件时,如果文件的硬链接数 到0 了,没有dentry对应,但是改文件仍不会马上被释放。要等到所有打开该文件的进程关闭该
文件,系统才会挑时间将改文件释放掉。
隐式回收:
当进程结束运行时,所有该进程打开的文件会被关闭,申请的内存空间会被释放。
// 实现 mv 命令
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
int main(int argc,char* argv[]){
link(argv[1],argv[2]);
unlink(argv[1]);
return 0;
}
文件、目录权限:
注意:目录文件也是 “文件” 其文件内容是该目录下所有子文件的目录项 dentry。可一尝试用vim打开一个目录。
r | w | x | |
文件 | 文件内容可以被查看 | 内容可以被修改 | 可以运行产生一个进程 |
cat、more、less ... | vi | ./文件名 | |
目录 | 目录可以被浏览 | 创建、删除、 修改文件 | 可以被打开进入 |
ls、tree | touch、rm、mv、mkdir | cd |