文件I/O操作

本文详细介绍了Linux系统中的缓存I/O机制,包括其优点(如减少读盘次数,提高性能)和缺点(数据拷贝导致的内存消耗)。接着讨论了直接I/O,它允许数据直接在磁盘和应用程序地址空间之间传输,提高了效率。最后,文章列举了在Linux中进行文件操作的基本步骤和关键函数,如open、close、write、read及ioctl等。

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

缓存IO

缓存 I/O 又被称作标准 I/O,大多数文件系统的默认 I/O 操作都是缓存 I/O。在 Linux 的缓存 I/O 机制中,操作系统会将 I/O 的数据缓存在文件系统的页缓存( page cache )中,也就是说,数据会先被拷贝到操作系统内核的缓冲区中,然后才会从操作系统内核的缓冲区拷贝到应用程序的地址空间。缓存 I/O 有以下这些优点:
 1、缓存 I/O 使用了操作系统内核缓冲区,在一定程度上分离了应用程序空间和实际的物理设备。
2、 缓存 I/O 可以减少读盘的次数,从而提高性能。
:当应用程序尝试读取某块数据的时候,如果这块数据已经存放在了页缓存中,那么这块数就可以立即返回给应用程序,而不需要经过实际的物理读盘操作。当然,如果数据在应用序读取之前并未被存放在页缓存中,那么就需要先将数据从磁盘读到页缓存中去。
:对于写操作来说,应用程序也会将数据先写到页缓存中去,数据是否被立即写到磁盘上去取决于应用程序所采用的写操作机制:如果用户采用的是同步写机制( synchronous writes ), 那么数据会立即被写回到磁盘上,应用程序会一直等到数据被写完为止;如果用户采用的是延迟写机制( deferred writes ),那么应用程序就完全不需要等到数据全部被写回到磁盘,数据只要被写到页缓存中去就可以了。
缓存IO 的缺点:在缓存 I/O 机制中,DMA 方式可以将数据直接从磁盘读到页缓存中,或者将数据从页缓存直接写回到磁盘上,而不能直接在应用程序地址空间和磁盘之间进行数据传输,这样的话,数据在传输过程中需要在应用程序地址空间和页缓存之间进行多次数据拷贝操作,这些数据拷贝操作所带来的 CPU 以及内存开销是非常大的。
程序地址空间—页缓存—磁盘,中间多了一个页缓存,老是拷贝数据造成内存消耗巨大。

直接IO

数据直接在磁盘和应用程序地址空间进行传输,所以该文件访问的机制称作为直接 I/O。Linux 中就提供了这样一种文件访问机制,对于那种将 I/O 缓存存放在用户地址空间的应用程序来说,直接 I/O 是一种非常高效的手段。

具体的文件操作

在所有的 linux 系统中,如果需要对文件的进行操作,只要包含如下 4 个头文件即可。
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
上面四个头文件中包含了打开,关闭,创建,读文件,写文件的函数,还有标志位,以及
在不同 32 位以及 64 位系统下数据长度的宏变量定义。
1、open 函数例程
使用 open 函数的时候会返回一个文件句柄,文件句柄是文件的唯一识别符 ID。对文件的
操作必须从读取句柄开始。
open 函数有两个原型:

  1. 两个参数的 open 函数主要用于创建文件 :int open(const char *path, int oflags);
  2. 以建立一个到文件或者设备的访问路径:int open(const char path, int oflags,mode_t mode);在打开或创建文件时可以制定文件。
    – 参数path表示:路径名或者文件名。路径名为绝对路径名。
    – 参数oflags表示:打开文件所采取的动作
    • O_RDONLY文件只读;O_WRONLY文件只写;O_RDWR文件可读可写;
    O_NOCTTY如果路径指向终端,则不将设备作为此进程的控制终端
    • O_NDELAY非阻塞方式操作文件
    – mode表示:设置创建文件的权限。权限的宏定义很麻烦,可以直接用数
    字替代
    – 返回值:出错返回-1;否则返回文件句柄
    2、creat函数
    关于 creat 函数,首先这个单词并不是表示创建的意思,创建的英文单词是“create”,
    这是早期的一个小的拼写错误,却一直沿用下来。
    在介绍 open 函数的时候,可以看到 open 函数有两种形式,一个是两个参数一个是三个
    参数,早期的时候 open 只有三个参数的形式,三个参数的形式会导致 open 函数无法打开一
    个未创建的文件,也就是无法建立文件,所以就有了这个 creat 函数。
    现在 creat 函数可以完全用 open 替代,考虑到在阅读代码的时候可能会碰到,所以简单
    介绍一下。creat 函数原型如下。
    int creat(const char * pathname, mode_t mode);
    creat 函数只有两个参数,参数的含义和 open 类似。
    大家看到这个函数的时候知道它是创建文件的就成,在写代码的时候完全可以用 open 代
    替。
    3、close关闭函数
    任何一个文件在操作完成之后都需要关闭,这个时候需要调用 close 函数。
    调用 close 函数之后,会取消 open 函数建立的映射关系,句柄将不再有效,占用的空间
    将被系统释放。
    close 函数在头文件“#include <unistd.h>”中,close 函数的使用和参数都比较简单. int close(int fd);
    参数 fd,使用 open 函数打开文件之后返回的句柄。
    返回值,一般很少使用 close 的返回值。
    4、write函数 对文件进行写操作,write 函数使用的比较多。
    ssize_t write(int fd, co
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值