首页 > 代码库 > I/O基本操作

I/O基本操作

ssize_t read(int fd,void* buffer,size_t count)

read调用并会在在buffer的末尾添加一个‘\0‘,所以若将buffer当作字符串处理的话需要自行添加‘\0‘,常用操作如下:

if((read_num = read(fd,buffer,count) > 0)

{

  buffer[read_num] = ‘\0‘;

  ...

}

 

fflush和fsync的区别:

fflush是C库中提供的库函数,而fsync是系统提供的系统调用

fflush通过调用write将用户空间的缓冲区写到内核空间的缓冲区中,而fsync将内核缓冲区中的数据冲洗到磁盘上

另外fsync是阻塞调用

数据的流动顺序如下:

printf等IO操作------>用户空间缓冲区(C库缓冲区)----->fflush(它会调用write)----->内核缓冲区------>fsync------>磁盘

如果程序的文件偏移量(对于每个打开的文件,系统内核会记录其偏移量)已然超过了文件末尾,再进行IO操作会发生什么。。。

--对于read调用会返回0,表示文件结尾

--对于write,可写入数据,但会形成文件空洞(从文件结尾到新写入数据间的这段空间称为空洞)。从编程角度讲,文件空洞中是存在字节的,读取空洞将返回以0(空字节)填充的缓冲区;但文件空洞并不占用任何磁盘空间,直到后续某个时点为在文件空洞中写入数据,文件系统才会为其分配磁盘块

I/O基本操作