1、什么是标准IO?与文件IO的区别?
文件IO:是直接调用内核提供的系统调用函数, 头文件是unistd.h
标准IO:是通过C库函数间接调用系统调用函数,头文件是: stdio.h
之前学过:输入输入相关的函数,都是和标准的输入(键盘)、标注的输出(显示器)相关
【getchar():从键盘得到一个字符,putchar():向显示器输出一个字符】
getchar(),putchar() ----一个字符
gets(buf),puts(buf) ----一串字符
scanf(),printf() ---- 一个字符,一串字符都可以
上述这些函数与一些普通文件(a.c)的读写没有关系,也即这些函数不能读写普通文件。
但标准IO 不同,既能读写一些普通的文件,也能向标准的输入和输出进行读写
代码范例:通过文件IO直接输出到显示器:0:标准输入;1:标准输出
#include <stdio.h>
#include <unistd.h>
int main()
{
char buf[]="hello zengzhi";
write(1,buf,sizeof(buf));
return 0;
}
运行结果:
通过标准IO:
#include <stdio.h>
#include <unistd.h>
int main()
{
char buf[]="hello zengzhi";
printf("%s",buf);
// write(1,buf,sizeof(buf));
return 0;
}
三个缓存的概念(数组):
- 我们的程序中的缓存,就是你想从内核读写的缓存(数组)----用户空间的缓存
- 每打开一个文件,内核在内核空间中也会开辟一块缓存,这个叫内核空间的缓存
文件IO中的写即是将用户空间中的缓存写到内核空间的缓存中。
文件IO中的读即是将内核空间的缓存写到用户空间中的缓存中。
3. 标准IO的库函数中也有一个缓存,这个缓存称为----库缓存,这个缓存介于用户空间的缓存和内核空间的缓存之间,标准IO就是通过库缓存为中间介质来进行用户空间缓存和内核空间的缓存进行交互的。
例1:测试验证库缓存的存在
标准IO库函数在什么时候会调用系统调用函数?
标准IO库缓存写满或满足一定条件时,会调用系统调用函数。
#include “stdio.h”
int main()
{
char buf[]=“hello linux”;
printf("%s",buf);
while(1);
return 0;
}
printf满足一定条件 : 遇到\n 时,即会将库缓存的内容写到内核中,即调用了系统调用函数。
#include “stdio.h”
int main()
{
char buf[]=“hello linux\n”;
printf("%s",buf);
while(1);
return 0;
}
库缓存写满时,会调用系统调用函数,将lib_buffer 内容写到kernel_buffer中去
#include “stdio.h”
int main()
{
char buf[]=“hello linux”;
int i=0;
while(i< 93)
{
printf("%s",buf);
i++;
}
printf(“h”);
while(1);
return 0;
}