文件存储
- 文件存储相关概念:inode、dentry、数据存储、文件系统。
inode
- 其本质为结构体,存储文件的属性信息。比如:权限、类型、大小、时间、用户、盘块位置…也叫文件属性管理结构,大多数的 inode 都存储在磁盘上。
dentry
- 目录项,其本质依然是结构体,重要成员变量有两个(文件名,inode…),而文件内容(data)保存在磁盘块中。
文件系统
- 文件系统是一组规则,规定对文件的存储及读取的一般方法。文件系统在磁盘格式化过程中指定
- 常见的文件系统有:fat32、ntfs、ext2、ext3、ext4
文件操作
stat()/lstat()
- int stat(const char *pathname, struct stat *statbuf);
- 参数:
- path:文件路径
- buf:(传出参数)存放文件属性
- 返回值:
- 成功:0
- 失败:-1 errno
- 获取文件大小:buf.st_size
- 获取文件类型:buf.st_mode
- 获取文件权限:buf.st.mode
- 符号穿透:stat()会,lstat()不会
link()
为了实现文件共享,Linux允许多个目录项共享一个 inode ,即共享盘块(data),不同文件名,在人类眼中将它理解成两个文件,但在内核眼里是同一个文件。link()函数,可以为已经存在的文件创建目录项(硬链接)。
- int link(const char *oldpath, const char *newpath);
- 成功:0
- 失败:-1,设置errno为相应值
unlink()
- 删除一个文件的目录项
- int unlink(const char *pathname);
- 成功:0
- 失败:-1,设置errno为相应值
- 注意Linux下删除文件的机制:不断将 st_nlink - 1,直到减到0为止。无目录项对应的文件,将会被操作系统择机释放。(具体时间由系统内部调度算法决定。)因此,我们删除文件,从某种意义上说,只是让文件具备了被释放的条件。
- unlink()函数的特征:清除文件时,如果文件的硬链接数到0了,没有 dentry 对应,但该文件仍不会马上被释放。要等到所有打开该文件的进程关闭该文件,系统才会挑时间将该文件释放掉。
隐式回收
- 当进程结束运行时,所有该进程打开的文件会被关闭,申请的内存空间会被释放。系统的这一特性称之为隐式回收系统资源。
目录操作函数
- DIR *opendir(const char *name);
- int closedir(DIR *dirp);
- struct dirent *readdir(DIR *dirp);
- struct dirent{
ino_t d_ino; /* Inode number */
char d_name[256]; /* Null-terminated filename */
}
- struct dirent{
重定向
dup() 和 dup2()
- int dup(int oldfd);
- oldfd:已有文件描述符
- 返回:新文件描述符
- int dup2(int oldfd, int newfd);
fcntl() 函数实现 dup()
- int fcntl(int fd,int cmd,…)
- cmd:F_DUPFD
- 参3:文件描述符,如果被占用,返回最小可用的,未被占用,返回等于该值的文件描述符。
2020 ZhiZDK 如转载请声明。