文件系统,隐匿在 Linux 背后的机制( 四 )
Lseek 系统调用会更改指针位置的值 , 以便后续对 read 或 write 的调用可以在文件中的任何位置开始 , 甚至可以超出文件末尾 。
lseek = Lseek, 段首大写 。
lseek 避免叫做 seek 的原因就是 seek 已经在之前 16 位的计算机上用于搜素功能了 。
Lseek 有三个参数:第一个是文件的文件描述符 , 第二个是文件的位置;第三个告诉文件位置是相对于文件的开头 , 当前位置还是文件的结尾
lseek(int fildes, off_t offset, int whence);
lseek 的返回值是更改文件指针后文件中的绝对位置 。 lseek 是唯一从来不会造成真正磁盘查找的系统调用 , 它只是更新当前的文件位置 , 这个文件位置就是内存中的数字 。
对于每个文件 , Linux 都会跟踪文件模式(常规 , 目录 , 特殊文件) , 大小 , 最后修改时间以及其他信息 。 程序能够通过 stat 系统调用看到这些信息 。 第一个参数就是文件名 , 第二个是指向要放置请求信息结构的指针 。 这些结构的属性如下图所示 。
文章插图
fstat 调用和 stat 相同 , 只有一点区别 , fstat 可以对打开文件进行操作 , 而 stat 只能对路径进行操作 。
pipe 文件系统调用被用来创建 shell 管道 。 它会创建一系列的伪文件 , 来缓冲和管道组件之间的数据 , 并且返回读取或者写入缓冲区的文件描述符 。 在管道中 , 像是如下操作
sort
最后一个系统调用是 fcntl , 它用来锁定和解锁文件 , 应用共享锁和互斥锁 , 或者是执行一些文件相关的其他操作 。
现在我们来关心一下和整体目录和文件系统相关的系统调用 , 而不是把精力放在单个的文件上 , 下面列出了这些系统调用 , 我们一起来看一下 。
文章插图
可以使用 mkdir 和 rmdir 创建和删除目录 。 但是需要注意 , 只有目录为空时才可以删除 。
创建一个指向已有文件的链接时会创建一个目录项(directory entry) 。 系统调用 link 来创建链接 , oldpath 代表已有的路径 , newpath 代表需要链接的路径 , 使用 unlink 可以删除目录项 。 当文件的最后一个链接被删除时 , 这个文件会被自动删除 。
使用 chdir 系统调用可以改变工作目录 。
最后四个系统调用是用于读取目录的 。 和普通文件类似 , 他们可以被打开、关闭和读取 。 每次调用 readdir 都会以固定的格式返回一个目录项 。 用户不能对目录执行写操作 , 但是可以使用 creat 或者 link 在文件夹中创建一个目录 , 或使用 unlink 删除一个目录 。 用户不能在目录中查找某个特定文件 , 但是可以使用 rewindir 作用于一个打开的目录 , 使他能在此从头开始读取 。
关注公众号 程序员cxuan 回复 cxuan 领取优质资料 。
我自己写了六本 PDF, 非常硬核 , 链接如下
我自己写了六本 PDF, 非常硬核 , 链接如下
【文件系统,隐匿在 Linux 背后的机制】我自己写了六本 PDF, 非常硬核 , 链接如下
文章插图
推荐阅读
- 谷歌建立新AI系统 可开发甜品配方
- 诺基亚为何宁可逐渐没落也不采用Android系统?长知识了
- 烟台港“管道智脑系统”上线 在国内率先实现原油储运全息智能排产
- vivo一款新机现身跑分网!运存和系统信息通通曝光
- 人瑞人才(06919):未来3年系统平台将发力智能化,打造职业生态链平台
- 消费者报告 | 美团充电宝电量不足也扣费,是质量问题还是系统缺陷?
- 谷歌修复Pixel 5系统音量问题 快门音效不再吵
- Axiomtek推出AIE100-903-FL-NX AI Edge系统 可在恶劣环境下运行
- 官宣!11款vivo系机型开始公测最新系统OriginOS
- 鸿蒙OS大一统需产业合力