Linux中的文件
一般情况下,每个存储设备或存储设备的分区(存储设备是硬盘、软盘、U盘 ..)被格式化为文件系统后,都会有两部份,一部份是iNode,另一部份是Block。Block是用来存储数据用的,而iNode就是用来存储这些数据的信息,这些信息包括文件大小、属主、归属的用户组、读写权限等。
在 Linux 中的文件系统中,文件 = N(N>=1)个 inode + M(M>=1)个数据块。
数据块,存放文件的内容数据,数据块的数目根据文件内容的大小而定。
inode 称为信息节点、索引节点、i 节点。其作用有二:
1、存储跟文件相关的属性信息,如修改时间、所有者、文件类型和文件长度,注意这些信息里并没有文件名;
2、存储指向文件内容数据块的指针信息。
在一个文件系统中,一个 inode 代表一个文件,并使用一个整数值来标志该 inode,称为 inode-number,该值对于一个文件系统而言是唯一的,即通过该值可以找到其对应的 inode。一般情况下,一个文件只有一个 inode 信息用来描述它。
综上所述,假设 Linux 系统中有一个文件 a,则该文件在文件系统层面上,可以抽象表示为下图(超级块描述文件系统本身的信息):
下面通过一个程序来获取某个文件的inode信息:
/* * 文件名:filstat.c * 描述: 打印指定文件名的inode信息 */ #include<stdio.h> #include<stdlib.h> #include<time.h> #include<sys/types.h> #include<sys/stat.h> #include<unistd.h> struct stat file_stat; void print_file_stat(struct stat *fs) { printf(">>>>>>>>>>>>>>>>>>>>>>>\n"); printf("inode: \t\t\t\t%ld\n",fs->st_ino); printf("protection : \t\t\t%o\n",fs->st_mode); printf("number of hard links: \t\t%lu\n",fs->st_nlink); printf("user ID of owner : \t\t%d\n",fs->st_uid); printf("group ID of owner : \t\t%d\n",fs->st_gid); printf("file size in bytes: \t\t%ld\n",fs->st_size); printf("time of last access : \t\t%s",ctime(&fs->st_atime)); printf("time of last modification: \t%s",ctime(&fs->st_mtime)); printf("time of last change: \t\t%s",ctime(&fs->st_ctime)); } int main(int argc, char *argv[]) { if( 2 != argc) { fprintf(stderr,"Usage: %s filename...\n",argv[0]); exit(-1); } if (0 != stat(argv[1], &file_stat)) { perror("stat"); exit(-1); } print_file_stat(&file_stat); return 0; }
运行结果: