• lstat,fstat,unmask,chmod,chown,文件截断函数,空洞文件


    chmod命令

    修改文件权限

    1. 直接使用数字-----8进制

    fd = open(“./new_file.txt”, O_RDWR|O_CREAT, 0664);

    指定的0664表示:创建出的文件的原始权限为rw-rw-r--

    1. 使用rwx设置权限

      1. 修改所有权限----chmod a=“权限” 文件名

      2. 修改一组权限----u=;g=;o=;(注意之间要,)

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zbU8zgJm-1667396940337)(/home/guojiawei/.config/Typora/typora-user-images/image-20221102214522846.png)]

      1. 修改一组中的一位权限

    lstat

    1. 功能

      • 与stat几乎完全一样,都是从块设备上的inode节点空间中读取文件的属性信息

      • 但是与stat唯一不同的是,lstat会区分链接文件

        当操作的文件是链接文件时:

        • stat获取的文件属性是链接文件背后所指向的文件,而不是链接文件的。
        • lstat直接显示的是链接文件本身的文件属性
    什么是链接文件

    ​ 如需要在系统上维护同一文件的两份或多份副本,除了保存多份单独的物理文件副本之外,还可以采用保存一份物理文件副本和多个虚拟副本的方法。 这种虚拟的副本就称为链接。链接是目录中指向文件真实位置的占位符。

    在Linux中有两种不同类型的文件链接:

    • 符号链接(软链接)
      • 符号链接就是一个实实在在的文件,它指向存放在虚拟目录结构中某个地方的另一个文件。
      • 这两个通过符号链接在一起的文件,彼此的内容并不相同
      • 使用 ln -s 命令创建符号链接时,源文件必须存在,链接文件必须不存在。
    • 硬链接
    具体操作

    创建mm.txt的链接文件pmm

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-r009H3AE-1667468141801)(/home/guojiawei/.config/Typora/typora-user-images/image-20221103164721376.png)]

    用stat获取mm.txt和pmm的属性

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xhik1wJ7-1667468141803)(/home/guojiawei/.config/Typora/typora-user-images/image-20221103164901317.png)]

    发现stat获取链接文件的属性是其指向的文件;也就是stat获取的pmm属性其实是mm.txt

    int main(int argv,char** argc){
        if(argv!=2) printf("输入参数个数错误!\n");
        struct stat aaa={0};
        lstat(argc[1],&aaa);//改用lstat
        printf("%d %lu %d %d %ld  %s\n",\
                aaa.st_mode,aaa.st_nlink,aaa.st_uid,\
                aaa.st_gid,aaa.st_size,argc[1]);
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-98qcUsXm-1667468141803)(/home/guojiawei/.config/Typora/typora-user-images/image-20221103165214923.png)]

    lstat获取的链接文件pmm的属性是自身的

    fstat

    与stat不同的是,fstat是使用文件描述符来操作的,当你不知道文件路径名,但是你知道指向这个文件的描述符时,就可以使用fstat来操作

    int main(int argv,char** argc){
        if(argv!=2) printf("输入参数个数错误!\n");
        struct stat aaa={0};
        int fd=open(argc[1],O_RDWR);
        fstat(fd,&aaa);//fstat
        printf("%d %lu %d %d %ld  %s\n",\
                aaa.st_mode,aaa.st_nlink,aaa.st_uid,\
                aaa.st_gid,aaa.st_size,argc[1]);
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    fstat和stat一样,不区分链接文件

    ls背后调用的是lstat

    chown命令

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i9NGN9B8-1667468141804)(/home/guojiawei/.config/Typora/typora-user-images/image-20221103173149637.png)]

    功能:用于修改文件的属主

    • 修改所属用户-------chown 新的所属用户 文件
    • 修改所属组-----------chown :新的组 文件
    • 同时修改----------chown 新的所属用户:新的组 文件

    unmask

    open创建文件给权限777依然不给其他用户写权限

    open函数创建新的文件时,如果指定的是0777满级权限的话,实际创建文件权限为0775(rwxrwxr-x)


    因为被文件权限掩码做了限制
    111 111 111 (0777)&~000 000 010 (0002)文件权限掩码
    (111 111 101)


    限制其它用户的写权限

    使用umask即可将文件权限掩码改为0

    #include 
    #include 
    //功能:修改文件权限掩码
    //参数mask:新的文件权限掩码
    //返回值是旧的文件权限掩码
    mode_t umask(mode_t mask);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    int main(void){
        int fd=0;
        mode_t ret=umask(0);
        printf("oldUmask=%d\n",ret);
        fd=open("hhh",O_RDWR|O_CREAT,0777);
        //mode_t umask(mode_t mask);
        printf("umask=%d",umask(ret));
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9


    符号链接文件的文件大小

    • 符号链接文件就是一个快捷键,背后指向了某个文件。
    • 符号链接文件的数据,就是所指向文件的文件名,所以它的文件大小指的就是这个名字的字符个数。

    ​ pfile -> file.txt

    文件截断函数

    open时,可以指定了O_TRUNC后,文件里面有数据的话,会将打开的文件截短(清空)为0.

    文件截短的函数truncate,它不仅能够将文件截为0,还可以把文件截短为任意长度

    #include 
    #include 
    // 函数功能----将文件长度截短为length所指定长度
    // 返回值---成功返回0,失败返回-1,errno被设置
    int truncate(const char *path, off_t length);
    int ftruncate(int fd, off_t length);		
    //truncate利用文件路径名操作,ftruncate利用文件描述符操作
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    truncate("mm.txt",10);
       int fd=open("mm.txt",O_RDWR);
    ftruncate(fd,3);
    
    • 1
    • 2
    • 3

    截断字符超过文件长度时候:

    在这里插入图片描述

    空洞文件

    ​ 在一般文件的情况下,对于普通文件来说,文件数据的理论大小 == 在块设备上实际占用的空间大小。
    单对于空洞文件来说,文件数据的理论大小 > 在块设备上实际占用的空间大小

    du命令是查看在块设备的实际大小。ls得出的是分配大小-----理论大小

    创建空洞文件
    int main(void){
      int fd=open("./mm.txt",O_RDWR|O_CREAT,0664);
      lseek(fd,300,SEEK_SET);//注意第三位是设置位
      write(fd,"hello",5);
      return 0;}
    
    • 1
    • 2
    • 3
    • 4
    • 5

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QkcjVT2s-1667480194059)(/home/guojiawei/.config/Typora/typora-user-images/image-20221103204640740.png)]

    文件系统如何管理文件

    文件系统就是一个软件代码,属于OS的一部分

    文件系统管理文件的逻辑结构——树形结构

    对于文件系统来说,目录是非常重要的文件组织节点

    • 超级区----负责“块设备”空间的分配和回收

    • inode节点区

      • 被划分为了一个个相连的,空间大小相同的inode节点空间

      • 每个节点空间被用于存放某个文件的属性信息,每个节点空间大小是固定的(512B)

      • 每个节点都有一个节点编号,通过节点编号就可以索引找到inode节点空间

        使用stat读取文件属性时,struct stat结构体中的st_dev成员,就是用来存储inode节点编号

    • 数据区-----专门用于存放文件的数据

      不是所有的文件都有数据,只有普通文件、目录、链接文件有数据,其它的文件只有属性,没有数据

    ​ 不同的数据块之间不一定是连续的,块之间使用地址进行相互链接,也即是说每一块都有存放前后块的地址,通过地址就可以找到前后块空间

    不同文件的数据区
    1. 普通文件

      如果是文本文件,数据就是文字编码。
      如果是纯二进制文件,数据就是机器指令之类。

    2. 目录文件

      目录文件里面放的内容,并不是目录所包含文件的数据,放的只是所包含文件的基本信息

      其中两个信息最重要--------- 文件名,文件的inode节点号

    3. 链接文件

      存放的数据很简单,就是所指向文件的文件名

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KQ1PYxZh-1667481890406)(/home/guojiawei/.config/Typora/typora-user-images/image-20221103212359363.png)]

  • 相关阅读:
    力扣(LeetCode)71. 简化路径(C++)
    课时4作业2
    【Java】JDBC连接MySQL数据库,一把斗地主时间从无到有讲个通透~
    JS逆向|突破某网站的移动端限制,让PC浏览器也能愉快访问
    laravel paginate追加数据
    机器学习笔记之受限玻尔兹曼机(二)模型表示
    详解:到底什么是GPS北斗授时服务器?
    Windows 10 启用windows功能.NET Framework3.5 时 windows无法完成请求的更改 错误代码:0x80072F8F解决方案
    正则表达式——2.正则表达式的基础
    MPLS综合实验
  • 原文地址:https://blog.csdn.net/weixin_47173597/article/details/127659829