我们使用ls-l的时候看到的除了看到文件名,还看到了文件元数据
Linux7种文件类型:
普通文件、目录文件、管道文件、软链接文件、块设备文件、字符设备文件socket文件
ls-l读取存储在磁盘上的文件信息,然后显示出来
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <unistd.h>
4 #include <sys/stat.h>
5 #include <string.h>
6
7 //求文件的大小
8 int main()
9 {
10 struct stat sbuf;
11 if(stat("./file",&sbuf)==-1)
12 perror("stat"),exit(1);
13 printf("Size:%d\n",sbuf.st_size);
14 return 0;
15 }
其实这个文件元信息除了通过ls方式来读取,还有一个stat
命令可以看到更多信息
为了解释Inode我们需要了解文件系统
文件系统
typedef struct iofile{
int cnt; 还剩多少个字节
char *base; 指向缓起始地址
char *ptr; 当前位置
int fd;
}FILE
超级块:存放文件系统本身的结构信息
I节点表:存放文件属性,如:文件大小、所有者、最近修改时间等
数据区:存放文件内容
因此我们知道创建一个新文件的操作:
- 存储属性
内核先找到一个空闲的i节点(这里是263466),内核把文件信息记录到其中。 - 存储数据
该文件需要存储三个磁盘块,内核找到了单个空闲块:300,500,800。将内核缓冲区的第一块数据复制到300,下一块复制到500,以此类推。 - 记录分配情况
文件内容按顺序300、500、800存放,内核在Inode上的磁盘分布区记录了上述块列表。 - 添加文件名到目录
新的文件名abc。Linux如何在当前的目录中记录这个文件?内核将入口(263466,abc)添加到目录文件。文件名和Inode之间的对应关系将文件名和文件的内容及属性连接起来。
硬链接
我们看到,真正找到硬盘上文件的并不是文件名,而是Inode。其实在Linux中可以让多个文件名对应于同一个Inode
- Size.c和def_size的链接状态文件相同,它们被称为指向文件的硬链接。内核记录了这个连接数,Inode 263466的硬链接数为2。
- 我们在删除文件时干了两件事:
- 在目录中将对应的记录删除
- 将硬链接数-1。如果为0,则将对应的硬盘释放。
软链接
硬链接是通过Inode引用另外一个文件,软链接是通过名字引用另外一个文件
软链接又叫符号链接,这个文件包含了另一个文件的路径名。可以是任意文件或目录,可以链接不同文件系统的文件
- 链接文件甚至可以链接不存在的文件,这就产生一般称之为”断链”的现象。
- 链接文件甚至可以循环链接自己。类似于编程语言中的递归。
- 软链接文件只是其源文件的一个标记,当删除了源文件后,链接文件不能独立存在,虽然仍保留文件名,但却不能查看软链接文件的内容了。
//用`ln -s` 命令可以生成一个软连接,如下:
[root@linux236 test]# ln -s source_file softlink_file
在对符号文件进行读或写操作的时候,系统会自动把该操作转换为对源文件的操作,但删除链接文件时,系统仅仅删除链接文件,而不删除源文件本身。
//删除硬/软链接用
rm softlink_file
//或者
unlink softlink_file
文件的三个时间
- 最后访问时间
Acess
- 文件内容最后修改时间
Modify
- 属性最后修改时间
Change