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(空字节)填充的缓冲区;但文件空洞并不占用任何磁盘空间,直到后续某个时点为在文件空洞中写入数据,文件系统才会为其分配磁盘块
时间: 2024-10-10 05:50:58