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()

9.5小结

#C#
全部评论

相关推荐

点赞 1 评论
分享
牛客网
牛客企业服务