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;
}

运行结果:

 

posted @ 2019-11-04 17:39  王清河  阅读(277)  评论(0编辑  收藏  举报