文件系统"/>
03文件系统
文件系统
题目:类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 最后一次修改亚数据的时间*/ };
- stat();通过文件路径获取属性(面对符号链接文件,获取所指向的文件的属性)
- 文件的访问权限和文件类型
- 文件类型 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)?
- 文件类型 bcd-lsp
- 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
- FAT16/32(U盘/SD卡 优点:轻量级)
- 文件系统:文件或数据的存储和管理
- 硬链接/符号链接(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);
- glob_t
- 方式二 一系列函数
- 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);
- opendir();
- 方式一glob(); 按照格式读取文件名
更多推荐
03文件系统
发布评论