1.       概述

Unix文件系统可划分为引导块、超级块、i结点块(inode区)和数据区等四个部分,其中:

(1)       引导块位于文件系统的第0号物理块,它保存了文件系统的引导代码;

(2)       超级块位于文件系统的第1号物理块,它描述了文件系统本身的结构信息,这个信息的数据结构一般为“struct filsys”, 定义在文件“filsys”中;

(3)       I节点区位于超级块之后,它描述了文件的属性信息,这个信息的数据结构一般为“struct dinode”,定义在文件“ino.h”中;

(4)       数据区位于i节点之后,用于存储文件的内容。

文件系统决定了文件的存储与寻址方式,UNIX文件系统采取了3级缓冲结构,并将文件属性存储于i节点中。

UNIX下的文件属性包括文件类型、文件访问权限、文件属主ID、文件属组ID、文件链接类、文件长度和文件时间等信息,文件按类型可以分为普通文件、目录文件、管道文件、设备文件、符号链接文件和SOCKET文件等,这些信息存储在文件对应的i节点中。

UNIX下获取文件系统信息的函数有statfs和fstatfs。

UNIX下获取文件属性的函数有stat、fstat和lstat。

磁盘文件读取工作原理:以命令”cat T1.c”为例

  1. 在当前目录文件中查找文件“T1.c”及其对应的i节点编写,假设为1109。
  2. 在i节点表中读取第1109号节点。
  3. 读取i节点中文件属性、访问权限等信息
  4. 读取i节点中磁盘地址表,按照三级索引规则在数据区读取文件内容。

2.       获取文件属性的C程序代码

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <time.h>

int GetFileType(mode_t st_mode, char *resp);/*获取文件类型*/

int GetFileMode(mode_t st_mode, char *resp);/*获取文件权限*/

int GetFileOtherAttr(struct stat info, char *resp);/*获取文件其他的一些信息*/

int main(int argc, char *argv[])

{

struct stat info;

char buf[100], *p = buf;

if(argc != 2)

{

fprintf(stderr, "ls1 filename/n");

return -1;

}

memset(buf, 0, sizeof(buf));

if(lstat(argv[1], &info) == 0)

{

p += GetFileType(info.st_mode, p);

p += GetFileMode(info.st_mode, p);

p += GetFileOtherAttr(info, p);

printf("%s %s/n", buf, argv[1]);

}

else

{

fprintf(stderr, "open file failed. /n");

return -1;

}

return 0;

}

int GetFileType(mode_t st_mode, char *resp)

{

if(resp == NULL)

return 0;

if(S_ISDIR(st_mode)) /*测试是否为目录文件*/

resp[0] = 'd';

else if(S_ISCHR(st_mode))/*测试是否为字符文件*/

resp[0] = 'c';

else if(S_ISBLK(st_mode))/*测试是否为块文件*/

resp[0] = 'c';

else if(S_ISREG(st_mode))/*测试是否为普通文件*/

resp[0] = '-';

else if(S_ISFIFO(st_mode))/*测试是否为管道文件*/

resp[0] = 'p';

else if(S_ISLNK(st_mode))/*测试是否为符号链接文件*/

resp[0] = '1';

else

resp[0] = ' ';

return 1;

}

int GetFileMode(mode_t st_mode, char *resp)

{

if(resp == NULL)

return 0;

memset(resp, '-', 9);

if(st_mode & S_IRUSR) /*测试属主读权限*/

resp[0] = 'r';

if(st_mode & S_IWUSR)/*测试属主写权限*/

resp[1] = 'w';

if(st_mode & S_IXUSR)/*测试属主执行权限*/

resp[2] = 'x';

if(st_mode & S_IRGRP)/*测试组读权限*/

resp[3] = 'r';

if(st_mode & S_IWGRP)/*测试组写权限*/

resp[4] = 'w';

if(st_mode & S_IXGRP)/*测试组执行权限*/

resp[5] = 'x';

if(st_mode & S_IROTH)/*测试其他用户读权限*/

resp[6] = 'r';

if(st_mode & S_IWOTH)/*测试其他用户写权限*/

resp[7] = 'w';

if(st_mode & S_IXOTH)/*测试其他用户执行权限*/

resp[8] = 'x';

return 9;

}

int GetFileOtherAttr(struct stat info, char *resp)

{

struct tm *mtime;

if(resp == NULL)

return 0;

mtime = localtime(&info.st_mtime);

return sprintf(resp, " %3d %6d %11d %04d%02d%02d", info.st_nlink, info.st_uid, info.st_gid, info.st_size, mtime->tm_year + 1900, mtime->tm_mon + 1, mtime->tm_mday);

}

3.       读取文件系统信息C程序代码

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <sys/types.h>

#include <sys/statfs.h>

#include <sys/vfs.h>

int main(int argc, char *argv[])

{

struct statfs buf;

if(argc != 2)

return 1;

statfs(argv[1], &buf);

printf("FILE SYSTEM:/ntype=%d/n", buf.f_type);/*文件系统类型*/

printf("bsize=%d/n", buf.f_bsize);              /*数据块大小*/

printf("blocks=%d/n", buf.f_blocks);            /*数据块总数*/

printf("bfree=%d/n", buf.f_bfree);              /*可用块*/

printf("files=%d/n", buf.f_files);              /*inode总数*/

printf("ffree=%d/n", buf.f_ffree);              /*可用inode数*/

printf("%s  : %d blocks %d i -nodes/n", argv[1], buf.f_bfree, buf.f_ffree);

return 0;

}

转载于:https://my.oschina.net/fuyajun1983cn/blog/263900

专题2 文件系统结构相关推荐

  1. Linux系统介绍(二)文件系统结构

    Table of Contents 概述 根目录/ 二进制目录 配置文件目录 数据目录 内存目录 /dev目录 物理设备文件 /dev/tty跟/dev/pts /dev/null /proc目录 / ...

  2. linux+网络根文件系统,认识Linux根文件系统结构

    INTRO 认识Linux根文件系统结构,尽管Linux的根文件系统在形式表现上是一体的(所有数据目录均为根目录下的子目录),但实际它们是多个不同的[逻辑主体](为了实现不同的逻辑 功能)组合在一起的 ...

  3. Linux根文件系统结构再认识

    Linux根文件系统结构再认识 刘建文(http://blog.csdn.net/keminlau ) INTRO 尽管Linux的根文件系统在形式表现上是一体的(所有数据目录均为根目录下的子目录), ...

  4. linux文件系统、文件系统结构、虚拟文件系统

    参考:linux文件系统及其目录结构.虚拟文件系统 作者:丶PURSUING 发布时间: 2021-02-15 09:33:29 网址:https://blog.csdn.net/weixin_447 ...

  5. Linux的FHS(文件系统结构标准)剖析

    Linux的FHS(文件系统结构标准)剖析 我们平时所说的Linux系统并不是说的某一个操作系统,而是指使用了由Linus Torvalds(林纳斯·托瓦兹)发明并领衔开发的Linux内核的所有操作系 ...

  6. 4、Linux的文件系统结构(目录树结构)

    2019独角兽企业重金招聘Python工程师标准>>> Linux的文件系统结构 顶端的"/"这个称为根目录,逻辑上所有东西都隶属于根目录 但是存储空间可以另外划 ...

  7. C语言基础专题 - 头文件引用

    C语言基础专题 - 头文件引用 本文介绍了C语言中头文件的引用方法 阅读本文前推荐阅读C语言预处理 1.

  8. yaffs2文件系统结构及应用

    文件系统是包括在一个磁盘(包括光盘.软盘.闪盘及其它存储设备)或分区中的目录结构:一个可应用的磁盘设备可以包含一个或多个文件系统:如果您想进入一个文件系统,首先您要做的是挂载(mount)文件系统:为 ...

  9. Linux 文件系统类型 文件系统结构 与Windows文件系统的比较

    Linux 文件系统类型 磁盘文件系统. 包括硬盘.CD-ROM.DVD.USB存储器.磁盘阵列等.常见文件系统格式有:autofs.coda.Ext(Extended File sytem,扩展文件 ...

最新文章

  1. Python IDE:PyCharm中的那些实用功能
  2. 基于rancher在线安装k8s集群
  3. WIN7下安装SVNserver端及client搭建协作环境
  4. Confluence 6 完成你的任务
  5. ubuntu 电源按钮操作_电源菜单和按笔记本电脑电源按钮时缺少休眠
  6. word关闭首字母自动大写
  7. 注解Annotation
  8. C++ 模板和 C# 泛型之间的区别(C# 编程指南)
  9. linux之C编程学习——getchar()和getch()
  10. ABAP培训进入SAP第一步
  11. 计算机网络原理_第8章 局域网技术 之二 令牌环
  12. Python 情人节超强技能 导出微信聊天记录生成词云,深入讲解Python
  13. BZOJ1579: [Usaco2009 Feb]Revamping Trails 道路升级
  14. kaldi中文语音识别thchs30模型训练
  15. Java-Java基础—(6)面向对象高级
  16. IT通过什么途径去美国工作?
  17. PCB 铜厚厚度和线宽的选择
  18. 正则html在线测试,正则作业.html
  19. PostgreSQL对汉字按拼音排序
  20. ASP内置对象及其作用

热门文章

  1. 解码转码---System.web.HttpUtility 对象分析
  2. 为什么白帽SEO更好?
  3. java9系列(八)Multi-Release JAR Files
  4. MySQL utf8mb4与emoji表情
  5. Redis list 之增删改查
  6. 20159208 《网络攻防实践》第七周学习总结
  7. varnish Cconfigure
  8. ASP.NET MVC 4 (三) 过滤器
  9. 10分钟完成一个业务流程的发布
  10. C语言复习篇之数组与指针