栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

文件系统与目录操作

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

文件系统与目录操作

1.mmap

addr:如果addr参数为NULL,内核自己在进程地址空间中选择合适的地址建立映射。如果addr不是NULL,则给内核一个提示,应该从什么地址开始映射,内核会选择addr之上的某个合适的地址开始映射。建立映射后,真正的映射首地址通过返回值可得到。

len:需要映射的那一部分文件的长度。off参数是从文件的什么位置开始映射,必须是页大小的整数倍。

filedes:该文件的描述符。

prot:有4种取值:①PROT_EXEC:映射的这一段可执行,如映射共享库 ②PROT_READ:映射的这一段可读 ③PROT_WRITE:映射的这一段可写 ④PROT_NONE:映射的这一段不可访问。

flag:MAP_SHARED:多个进程对同文件映射共享,MAP_PRIVATE:多个进程对同文件映射不共享 

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

int main(void) {
    int fd = open("test.txt", O_RDWR);
    if (fd < 0) {
        perror("open file");
        exit(1);
    }
    int *p = mmap(NULL, 6, PROT_WRITE, MAP_SHARED, fd, 0);
    ((int *)((char *)p) + 1)[0] = 0x30313233;
    munmap(p, 6);
    return 0;
}

2.虚拟文件系统VFS 【1】ext2文件系统

文件系统中存储的最小单位是块,一个块究竟多大是格式化时确定的,如:mke2fs的-b选项可以设定块大小是1024,2048或4096字节。

启动块:大小就是1KB,由PC标准确定,用来存储磁盘分区信息和启动信息,任何文件系统偶读不能使用该块。

超级块:描述整个分区的文件系统信息,如:块大小,文件系统版本号,上次mount的时间等。超级块在每个块组的开头都有一份拷贝 。

块组描述符表:由很多块组描述符组成,整个分区分成多少个块组就对应有多少个块组描述符。每个块组描述符存储一个块组的描述信息,包括inode表从哪里开始,数据块从哪里开始,空闲的inode和数据块还有多少个。块组描述符表在每一个块组的开头都有一份拷贝,这些信息很重要,因此都有多份拷贝。

inode位图:和块位图类似,本身占一个块,其中每一个bit表示一个inode是否空闲可用。

inode表:文件类型(常规,目录,符号链接),权限,文件大小,创建/修改/访问时间等信息存在inode中,每个文件都有一个inode。

数据块:

        ①常规文件:文件的数据存在数据块。

        ②目录:该目录下的所有文件名和目录存在数据块。(文件名保存在所在目录的数据块中,其他信息都保存在该文件的inode中)。

        ③符号链接:如果目标路径名较短则直接保存在inode中,以便更快查找,否则分配一个数据块来保存。

        ④设备文件、FIFO,socket等特殊文件:没有数据块,设备文件的主设备和次设备号保存在inode。

【2】stat(2)

读取文件的inode,然后把inode中的各种文件属性填入一个struct stat结构体传出给调用者。

stat(1)命令是基于stat函数实现的。

stat需要根据传入的文件路径找到inode。

#include 
#include 
#include 
#include 
#include 
#include 
#include 

int main(int argc, char *argv[]) {
    struct stat st;
    if (argc < 2) {
        printf("usage:cmd + filename,dirnamen");
        exit(1);
    }

    lstat(argv[1], &st);
    switch (st.st_mode & S_IFMT)
    {
    case S_IFREG:
        printf("Is regular filen");
        break;
    case S_IFDIR:
        printf("Is directoryn");
        break;
    case S_IFCHR:
        printf("Is charactor devicen");
        break;
    default:
        printf("Is other file typen");
        break;
    }
    return 0;
}

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/724942.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号