前言
本文主要讲解了Linux系统中的标准IO和文件IO,重点讲解了它们的一同和关系。
并且集中阐释了IO缓存,并且有代码示例
`
一、标准IO与文件IO的区别
文件IO:是直接调用内核提供的系统调用函数,头文件是unistd.h
标准IO:是间接调用系统调用函数,头文件是:stdio.h。
标准IO中的相关函数,不仅可以读写普通文件,也可以向标准输入或者标准的输出中读或者写。
二、IO缓存
1.三个缓存空间
代码如下(示例):
(1)我们程序中的缓存,就是想从内核空间读取的缓存,叫用户空间缓存。
(2)每打开一个文件,内核在内核空间也会开辟一块缓存,叫做内核空间缓存。
文件IO写就是将用户空间的缓存写到内核空间的缓存中
文件IO读就是将内核空间的缓存写到用户空间的缓存中
(3)标准IO库函数也有一个缓存,这个缓存称为库缓存。
当标准IO库缓存被写时满足一定的条件,就会调用系统调用函数,即将库缓存写到内核空间的缓存中
2.代码实例
对于printf函数:
条件一:遇到\n时,会将库缓存的内容写到内核缓存中
条件二:库缓存写满时也会将内容写到内核缓存中,其中库缓存的大小为1024字节
相关代码:
(一)
#include<stdio.h>
#include<unistd.h>
Int main()
{
char buf[]=”hello world!”;
printf(“%s”,buf);
while(1);
return 0;
}
(二)
#include<stdio.h>
#include<unistd.h>
Int main()
{
char buf[]=”hello world!\n”;
printf(“%s”,buf);
while(1);
return 0;
}
(三)
#include<stdio.h>
#include<unistd.h>
Int main()
{
char buf[]=”hello world!”;
write(1,buf,sizeof(buf));
while(1);
return 0;
}
(四)
#include<stdio.h>
#include<unistd.h>
Int main()
{
int i=0;
char buf[]=”hello world!”;
while(i<100)
{
printf(“%s”,buf);
i++;
}
while(1);
return 0;
}
上述代码运行后,代码二和代码三会打印出信息,并且卡在循环处,而代码一会不显示任何内容卡在循环处。代码四会打印出几十个重复的打印信息,并且卡在循环处。
说明:
(1)write作为文件IO,直接进行用户缓存到内核缓存的写入
(2)出现上述两个情况后,库缓存就会写入内核缓存了
三、文件IO与标准IO的函数对应关系
open-----fopen
close-----fclose
lseek-----fseek或者rewind
read,write-------读写函数有三类,全缓存,行缓存,无缓存