03文件系统

本文详细介绍了如何实现类似ls的功能,包括获取文件属性的stat、fstat和lstat函数,以及文件的访问权限和类型判断。讲解了umask的作用、文件权限的更改以及硬链接和符号链接的区别。还涵盖了目录操作如mkdir、rmdir,以及文件时间戳的更改、目录内容的读取等。此外,讨论了文件系统的不同类型,如FAT和UFS。
摘要由CSDN通过智能技术生成

文件系统

题目:类ls的实现:myls -l -a -i -n

文件和目录

  • 获取文件属性
    • stat();通过文件路径获取属性(面对符号链接文件,获取所指向的文件的属性)
      • int stat(const char *pathname, struct stat *statbuf);
        
    • fstat();通过文件描述符获取属性
      • int fstat(int fd, struct stat *statbuf);
        
    • lstat();面对符号链接文件时,获取的是符号链接文件的属性
      • int lstat(const char *pathname, struct stat *statbuf);
        
    • struct stat
      {
          dev_t     st_dev;         /* 包含当前文件的设备 的ID号 */
          ino_t     st_ino;         /* Inode 号 */
          mode_t    st_mode;        /* 权限信息 */
          nlink_t   st_nlink;       /* 硬链接数量 */
          uid_t     st_uid;         /* 用户ID */
          gid_t     st_gid;         /* 组ID */
          dev_t     st_rdev;        /* 设备 ID 号 */
          off_t     st_size;        /* 文件的总字节数 */
          blksize_t st_blksize;     /* 一个block多大 (512B) */
          blkcnt_t  st_blocks;      /* 占用了多少个512B的块*/
          struct timespec st_atim;  /* atime 最后一次读的时间*/
          struct timespec st_mtim;  /* mtime 最后修改数据的时间*/
          struct timespec st_ctim;  /* ctime 最后一次修改亚数据的时间*/
      };
      
  • 文件的访问权限和文件类型
    • 文件类型 bcd-lsp
      • d目录
      • c字符设备
      • b块设备
      • -常规文件
      • l符号链接
      • s网络套接字文件
      • p匿名管道文件
    • st-mode是一个16位的位图
      • 用于表示文件类型
      • 特殊权限位
      • 文件访问权限
      • mode_t类型
        • 基本9位(权限)
        • u+s位
        • g+s位
        • t粘住位
        • 文件类型7种 占3个位
      • 使用下面的宏来判断文件类型
        S_ISBLK(m)  block device?
        S_ISCHR(m)  character device?
        S_ISDIR(m)  directory?
        S_ISREG(m)  is it a regular file?
        S_ISLNK(m)  symbolic link?  (Not in POSIX.1-1996.)
        S_ISSOCK(m) socket?  (Not in POSIX.1-1996.)
        S_ISFIFO(m) FIFO (named pipe)?
        
  • umask
    • touch空文件权限(默认0666 & ~umask)
    • umask作用:防止产生权限过松的文件
  • 文件权限的更改
    • int chmod(const char *pathname, mode_t mode);
      
    • int fchmod(int fd, mode_t mode);
      
  • 粘住位(t位)
    • 最初:为了在内存中保留二进制可执行文件, 从而下次装载变快 (page cache代替了)
    • 现在:给目录 设置t位->特殊化
  • 文件系统:FAT UFS
    • 文件系统:文件或数据的存储和管理
      • FAT16/32(U盘/SD卡 优点:轻量级)
        • 实质:静态存储的单链表
      • UFS
  • 硬链接/符号链接(symbol)
    • 硬链接:像两个指针指向同一空间(不能跨分区建立,不能给目录建立)
    • 符号链接:0大小(能跨分区建立,可以给目录建立)
    • 只要这块空间在被引用,就不能在硬件上清空
    • 相关函数
      • link();
      • unlink();方便地获得一个匿名文件
      • remove();
      • rename();改变文件名或移动目录
  • utime更改时间(不常用)
    • 更改最后读atime或最后改mtime
  • 目录的创建和销毁
    • mkdir();
    • rmdir(); 删除空目录empty
  • 更改当前工作路径
    • chdir();bug:可以突破假根技术(chroot穿越)
    • fchdir(int fd);
    • getcwd();当前工作目录
  • 分析目录/读取当前目录内容(man 3)(mydu)
    • 方式一glob(); 按照格式读取文件名
      int glob(const char *pattern, int flags,int (*errfunc) (const char *epath, int eerrno),glob_t *pglob);
      void globfree(glob_t *pglob);
      
      • glob_t
        typedef struct {
            size_t   gl_pathc;
            char   **gl_pathv;
            size_t   gl_offs;
        }glob_t;
        
      • 返回值:正常返回0,出错返回错误号
      • 示例
        err = glob("/etc/*", 0, NULL, &globres);
        
    • 方式二 一系列函数
      • opendir();
        DIR *opendir(const char *name);
        
      • closedir();
        int closedir(DIR *dirp);
        
      • readdir();
        struct dirent *readdir(DIR *dirp);
        
        • struct dirent {
              ino_t          d_ino;       /* Inode */
              off_t          d_off;       /* 不知是啥 */
              unsigned short d_reclen;    /* 不知是啥 */
              unsigned char  d_type;      /* 文件类型 */
              char           d_name[256]; /* 文件名 */04sysfile_and_data/
          };
          
      • rewinddir();
        void rewinddir(DIR *dirp);
        
      • seekdir();
        void seekdir(DIR *dirp, long loc);
        
      • telldir();
        long telldir(DIR *dirp);
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值