Linux中文件系统相关知识(5)

本文深入探讨了文件存储的关键概念,包括inode、dentry的作用,以及文件系统如何规定文件的存储与读取规则。详细介绍了常见文件系统如fat32、ntfs、ext系列,并解释了文件操作如stat()、link()、unlink()的功能与机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文件存储
  • 文件存储相关概念: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 */
      }
重定向
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 如转载请声明。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值