Linux嵌入式C 应用编程(标准IO库)
1.文件IO和标准IO
区别和联系
1.两者都是C语言函数,标准IO:标准c库函数 文件IO:Linux系统调用
2.标准IO是对文件IO进行了封装,本质还是使用文件IO
3.可移植性:对于不同操作系统,内核向应用层提供接口不一样,比如名称,参数,参数个数等。而标准IO在不同的操作系统中接口定义几乎一样,具有较好可移植性。
4.标准IO在用户空间有自己的stdio缓存区,文件IO在用户空间没有自己的缓存区,所以在性能上,标准IO要优于文件IO
2.FILE指针和fd
相同:都是用来描述文件的,相当于文件的指针
不同:FILE是用于标准IO的,fd是用于文件IO的
3.在标准 I/O 中,可以使用 stdin、 stdout、 stderr 来表示标准输入、标准输出和标准错误。
4.fopen和fclose
fopen只有两个参数,要打开的文件,以及以什么权限打开。新创建的文件怎么办?有一个默认值,权限全开。
和close没啥区别
5.fwrite和fread
四个参数,分别是
缓存区(读就是放从文件读出来的东西的缓存区,写就是放要写入文件的东西的缓存区)
每个数据项的大小
数据项的个数
FILE指针
返回值(调用成功后写/读的数据项的个数)
6.fseek和ftell
完全没有区别,三个参数,文件指针,偏移量,偏移位置(在这里说一下,不管是lseek还是fseek,偏移量那个参数可以写负的,比如: xx, -4, SEEK_END 。 就是将位置偏移到文件结束还有四个字节的位置)
ftell是用来获取当前读写偏移量的
7.feof,ferror,clearerr
feof判断文件是否到末尾 / ferror判断文件IO操作是否出错 / 清错
8.格式化I/O
8.1printf
8.2scanf
9.I/O缓冲(重要)
9.1文件I/O的内核缓冲和标准库I/O的stdio缓存
read和write操作并不会直接访问磁盘,而是在stdio缓存区和write缓存区之间复制数据
9.2fsync/fdatasync/sync和标志位O_SYNC
功能:把kernel缓存区的数据写到磁盘中
区别:1.写kernel缓存区fd对应的的所有数据(除了内容数据还有元数据(元数据是描述数据的数据))到磁盘fsync
2.写kernel缓存区该fd对应的内容数据到磁盘fdatasync
3.写kernel缓存区所有数据到磁盘sync
控制内核缓存的标志
open加标志位O_SYNC,会在写的时候直接保存
9.3绕过内核缓存
在open标志位加O_DIRECT并且注明数据存放地址
功能:直接写入磁盘,但是比较慢
而且有以下三个注意事项:
1.存放数据的缓存区的起始地址必须以块大小的整数倍进行对齐
2.写文件时偏移量必须是块大小整数倍
3.写入的数据大小也必须是块大小的整数倍
9.4stdio缓存
标准 I/O 函数会将用户写入或读取文件的数据缓存在 stdio 缓冲区,然后再一次性将 stdio 缓冲区中缓存的数据
1.通过调用 文件 I/O 写入到 内核缓冲区(setbuf)******(重要)
2.或者拷贝到应用程序的 buf 中。
setbuf:设置缓冲模式(没有缓冲,行缓冲,全缓冲)以及缓冲区大小
强制刷新stdio缓冲区:fflush()