Linux系统编程手册 文件I/O缓冲

来源:互联网 发布:淘宝优惠券代理 编辑:程序博客网 时间:2024/05/16 16:59

文件I/O内核缓冲

read、write系统调用在操作磁盘文件时不会直接发起磁盘访问,而是仅仅在用户空间缓冲区与内核缓冲区之间复制数据。

例如:如下调用将3个字节的数据从用户空间内存传递到内核空间的缓冲区中:

write(fd, "abc", 3);

write随即返回。在后续的某个时刻,内核会将其缓冲区的数据写入磁盘。如果在此期间,另一个进程试图读取该文件的这几个字节,那么内核将自动从缓冲区中提供这些数据,而不是从文件中。


同理,读取数据。内核从磁盘中读取数据到内核缓冲区。read调用将从缓冲区读取数据,直到把缓冲区数据读完,这是内核会将文件的下一段内容读入到内核缓冲区。

采用这样的设计,使read write调用更为快速,不需要等待磁盘操作,也更为高效,减少了磁盘的传输次数。


stdio库的缓冲

当操作磁盘文件时,缓冲大块数据可以减少系统调用,C语言函数库的I/O函数 fgets fgetcfprintf等就是这么做的。

我们可以调用setvbuf可以控制stdio库使用缓冲的形式。有下面3种:

1.不对I/O缓冲,等于每个stdio函数直接操作write read函数

2.采用行缓冲

3.采用全缓冲


我们可以使用fflush库函数强制将stdio输出流中的数据刷新到内核缓冲区。

int fflush(FILE *stream);


控制文件I/O的内核缓冲

有时候我们需要强制刷新内核缓冲区到磁盘文件。


fsync将与打开文件描述符fd相关的所有内核中的缓冲数据刷新到磁盘中。

int fsync(int fd);


sync会使包含更新文件信息的所有内核缓冲区刷新到磁盘上

void sync(void);

我们在调用open函数打开文件的时候,可以指定O_SYNC,这样每次write调用都会将文件数据刷新到磁盘上


1 0
原创粉丝点击