【问题标题】:File Access method in LinuxLinux中的文件访问方法
【发布时间】:2011-12-03 21:03:04
【问题描述】:
看教科书主要有两种文件访问方式;顺序和直接。我们在 Linux 中使用的是哪一个?
在读取命令中,我们给出要读取的字节数以及要读取的缓冲区。所以我们在 Linux 中有顺序访问?
但实际上我们存储的文件是块吗?我无法与之相关。
在 Linux 中是否可以直接访问?
我在 Galvin 的操作系统概念中读到了这些访问模型
【问题讨论】:
标签:
linux
file
file-io
filesystems
operating-system
【解决方案1】:
两者都可以。
当您对普通文件执行read 时,它确实会按顺序读取文件,每次都会将文件指针前进适当的量。
但您也可以使用seek 移动到文件中的任意点。
并非所有文件都支持随机/直接访问。例如,管道通常只是顺序访问(您不能后退或向前跳过)。
所以几乎一切皆有可能,但某些文件类型有限制。
(使用直接 I/O(O_DIRECT 标志)访问文件是完全不同的概念。)
【解决方案2】:
您当然可以从打开的(光盘)文件中的任意位置读/写。
随机 IO 有多种方法,针对不同的使用情况进行了优化。
- 最简单的方法是 seek() 后跟 read() 或 write()。文件指针按读/写的字节数移动,它可以允许随机跳转后的顺序 IO。将 seek() 视为在逻辑上旋转旧的“卷到卷”磁带驱动器(即使我们不再拥有这些)。
- pread 和 pwrite 系统调用结合了 seek() 和 read/write(),专门用于多线程程序(其中两个系统调用会导致竞争条件)。它们不会更改文件指针,因此您可以在逻辑上认为它只是获取或放置随机数据位。
- mmap() 将文件映射到内存中 - 然后您可以使用传统的指针/内存操作(例如,memset、memcpy 等)在其中使用它,您将如何处理。