文件系统,隐匿在 Linux 背后的机制( 四 )


Lseek 系统调用会更改指针位置的值 , 以便后续对 read 或 write 的调用可以在文件中的任何位置开始 , 甚至可以超出文件末尾 。
lseek = Lseek, 段首大写 。
lseek 避免叫做 seek 的原因就是 seek 已经在之前 16 位的计算机上用于搜素功能了 。
Lseek 有三个参数:第一个是文件的文件描述符 , 第二个是文件的位置;第三个告诉文件位置是相对于文件的开头 , 当前位置还是文件的结尾
lseek(int fildes, off_t offset, int whence);lseek 的返回值是更改文件指针后文件中的绝对位置 。 lseek 是唯一从来不会造成真正磁盘查找的系统调用 , 它只是更新当前的文件位置 , 这个文件位置就是内存中的数字 。
对于每个文件 , Linux 都会跟踪文件模式(常规 , 目录 , 特殊文件) , 大小 , 最后修改时间以及其他信息 。 程序能够通过 stat 系统调用看到这些信息 。 第一个参数就是文件名 , 第二个是指向要放置请求信息结构的指针 。 这些结构的属性如下图所示 。
文件系统,隐匿在 Linux 背后的机制文章插图
fstat 调用和 stat 相同 , 只有一点区别 , fstat 可以对打开文件进行操作 , 而 stat 只能对路径进行操作 。
pipe 文件系统调用被用来创建 shell 管道 。 它会创建一系列的伪文件 , 来缓冲和管道组件之间的数据 , 并且返回读取或者写入缓冲区的文件描述符 。 在管道中 , 像是如下操作
sort sort 进程将会输出到文件描述符1 , 也就是标准输出 , 写入管道中 , 而 head 进程将从管道中读入 。 在这种方式中 , sort 只是从文件描述符 0 中读取并写入到文件描述符 1 (管道)中 , 甚至不知道它们已经被重定向了 。 如果没有重定向的话 , sort 会自动的从键盘读入并输出到屏幕中 。
最后一个系统调用是 fcntl , 它用来锁定和解锁文件 , 应用共享锁和互斥锁 , 或者是执行一些文件相关的其他操作 。
现在我们来关心一下和整体目录和文件系统相关的系统调用 , 而不是把精力放在单个的文件上 , 下面列出了这些系统调用 , 我们一起来看一下 。
文件系统,隐匿在 Linux 背后的机制文章插图
可以使用 mkdir 和 rmdir 创建和删除目录 。 但是需要注意 , 只有目录为空时才可以删除 。
创建一个指向已有文件的链接时会创建一个目录项(directory entry) 。 系统调用 link 来创建链接 , oldpath 代表已有的路径 , newpath 代表需要链接的路径 , 使用 unlink 可以删除目录项 。 当文件的最后一个链接被删除时 , 这个文件会被自动删除 。
使用 chdir 系统调用可以改变工作目录 。
最后四个系统调用是用于读取目录的 。 和普通文件类似 , 他们可以被打开、关闭和读取 。 每次调用 readdir 都会以固定的格式返回一个目录项 。 用户不能对目录执行写操作 , 但是可以使用 creat 或者 link 在文件夹中创建一个目录 , 或使用 unlink 删除一个目录 。 用户不能在目录中查找某个特定文件 , 但是可以使用 rewindir 作用于一个打开的目录 , 使他能在此从头开始读取 。
关注公众号 程序员cxuan 回复 cxuan 领取优质资料 。
我自己写了六本 PDF, 非常硬核 , 链接如下
我自己写了六本 PDF, 非常硬核 , 链接如下
【文件系统,隐匿在 Linux 背后的机制】我自己写了六本 PDF, 非常硬核 , 链接如下
文件系统,隐匿在 Linux 背后的机制文章插图


推荐阅读