I/O编程技术(文件IO)笔记纲要梳理

序言
Linux基本知识回顾
Linux内核安全管理机制
根文件系统rootfs
Linux根目录下文件结构
Linux文件类型
标准IO
标准IO操作数据流分析
文件 打开、关闭
fopen( )
fclose( )
文件 字符读写
fgetc( )
fputc( )
文件 行读写
fgets( )
fputs( )
文件 数据快读写
fread( )
fwrite( )
文件 当前位置偏移量 获取 设置
ftell( )
fseek( )
rewind( )
文件 状态判断
feof( )、ferror( )
标准输入设备 读取、输出
getchar( )
putchar( )
时间函数
time( )
localtime( )
刷新缓冲区
fflush( )
系统IO
打开关闭
open( )
close( )
数据读写
read( )
write( )
文件位置偏移量
lseek( )
内存映射
mmap( )
实践开发
LCD屏幕显像原理
驱动架构
软件层
LCD内核源码
文件控制
ioctl( ) 文件控制
mmap( )内存映射
munmap()解除映射
屏幕显示
BMP图像的储存
其它函数
sscanf( )
描述
声明
参数
返回值
strcmp( )
remove()
getchar()
strftime()
atoi()
参考文档

序言

尽可能压缩笔记,核心在于构建核心知识单元网络。

Linux基本知识回顾

Linux内核安全管理机制

fig:

根文件系统rootfs

fig:

Linux根目录下文件结构

fig:

Linux文件类型

-(regular) 普通文件
d(directory) 目录文件
p(pipe) 管道文件
s(socket) 套接字文件
l(link) 链接文件
c(character) 字符设备文件
b(block) 块设备文件

标准IO

标准IO操作数据流分析

fig:

文件操作接口

文件 打开、关闭

fopen( )

fig:

加b是以二进制处理

fclose( )

fig:

文件 字符读写

fgetc( )

fig:

fputc( )

fig:

文件 行读写

fgets( )

fig:

fputs( )

fig:

文件 数据快读写

fread( )

fig:

fwrite( )

fig:

字符串要用strlen函数,sizeof(“字符串”)得到的是地址一个字长。

文件 当前位置偏移量 获取 设置

ftell( )

fig:

相较于文件开头的字节数

fseek( )

fig:

rewind( )

fig:

rewind(fp)相等于fseek(fp, 0L, SEEK_SE);

文件 状态判断

feof( )、ferror( )

fig:

标准输入设备 读取、输出

getchar( )

getchar( )缺省从标准输入设备读取一个字符。

putchar( )

putchar( )缺省从标准输出设备输出一个字符。

时间函数

time( )

获取1970至今的秒数

localtime( )

转换timer的值为tm结构 后的值

刷新缓冲区

fflush( )

刷新全缓冲

系统IO

api:应用程序编程接口

sdk:软件开发工具包

标准I/O可以看成是在系统I/O的基础上封装了缓冲机制。

文件描述符是一个小的非负整数。

打开关闭

open( )

fig:

close( )

fig:

数据读写

read( )

fig:

write( )

fig:

文件位置偏移量

lseek( )

fig:

内存映射

mmap( )

fig:

fig:

实践开发

LCD屏幕显像原理

偏光片、彩色滤光片

像素数量、

像素色深(位深度、色域) : bit-->4Bytes-->ARGB

驱动架构

Framebuffer驱动子系统

粤嵌屏幕分辨率 800*480。

ll: c或b开头的都是硬件设备驱动提供的文件

设备文件在/dev/fb0

软件层

LCD内核源码

要看内核源码

Linux最多支持32块(编号0~31)LCD屏幕.

文件控制

ioctl( ) 文件控制

该函数是一个专用于设备输入输出操作的系统调用,该调用传入一个跟设备有关的请求码,系统调用的功能完全取决于请求码。

fig:

ioctl(文件描述符,请求码,某类型指针) 可以获取或设置硬件设备的参数

#include <sys/ioctl.h>
int ioctl(int fd, unsigned long request, ...);

下面我们解释各个参数的含义。
1)fd是文件描述符。当我们的设备作为特殊文件被open()函数打开后,会返回一个文件描述符,通过操作这个文件描述符达到操作设备文件的目的。

2)request是命令码,应用程序通过下发命令码来控制驱动程序完成对应操作。

3)第三个参数“…”是可变参数arg,一些情况下应用程序需要向驱动程序传参,参数就通过ag来传递。ioctl函数中的“…”只能传递一个参数,但内核不会检查这个参数的类型。那么,就有两种传参方式:只传一个整数,传递一个指针。

如果ioctl执行成功,它的返回值就是驱动程序中ioctl接口给的返回值,驱动程序可以通过返回值向用户程序传参。但驱动程序最好返回一个非负数,因为用户程序中的ioctl运行失败时一定会返回-1并设置全局变量errorno。

errono不同的值代表的含义如下:

EBADF:fd是一个无效的文件描述符。
EFAULT:在arg是指针的前提下,argp指向一个不可访问的内存空间。
EINVAL:request或argp是无效的。
ENOTTY:fd没有关联到一个字符特殊设备,或该request不适用于文件描述符fd引用的对象类型。(说人话就是fd没有指向一个字符设备,或fd指向的文件不支持ioctl操作)

因此,在用户空间调用ioctl时,可以使用如下的错误判断处理。包括的两个头文件,string.h声明了strerror函数,errno.h定义了错误码errno。

#include <string.h>
#include <errno.h>

int ret;
ret = ioctl(fd, MYCMD);
if (ret == -1)
printf("ioctl: %s\n", strerror(errno));

mmap( )内存映射

fig:

fig:

munmap()解除映射

#include <sys/mman.h>

int munmap(void *addr, size_t length);

munmap()系统调用解除指定地址范围内的映射,参数 addr 指定待解除映射地址范围的起始地址,它必须是系统页大小的整数倍;参数 length 是一个非负整数,指定了待解除映射区域的大小(字节数),被解除映射的区域对应的大小也必须是系统页大小的整数倍,即使参数 length 并不等于系统页大小的整数倍,与 mmap()函数相似。

需要注意的是,当进程终止时也会自动解除映射(如果程序中没有显式调用 munmap()),但调用 close() 关闭文件时并不会解除映射。

通常将参数 addr 设置为 mmap()函数的返回值,将参数 length 设置为 mmap()函数的参数 length,表示解除整个由 mmap()函数所创建的映射。

屏幕显示

BMP图像的储存

BMP图像内存采用小端存储.

fig:

其它函数

sscanf( )

描述

C 库函数 int sscanf(const char *str, const char *format, ...) 从字符串读取格式化输入。

声明

下面是 sscanf() 函数的声明。

int sscanf(const char *str, const char *format, ...)

参数

  • str -- 这是 C 字符串,是函数检索数据的源。
  • format -- 这是 C 字符串,包含了以下各项中的一个或多个:空格字符、非空格字符format 说明符
    format 说明符形式为 [=%*[modifiers]type=],具体讲解如下:

参数

描述

*

这是一个可选的星号,表示数据是从流 stream 中读取的,但是可以被忽视,即它不存储在对应的参数中。

width

这指定了在当前读取操作中读取的最大字符数。

modifiers

为对应的附加参数所指向的数据指定一个不同于整型(针对 d、i 和 n)、无符号整型(针对 o、u 和 x)或浮点型(针对 e、f 和 g)的大小: h :短整型(针对 d、i 和 n),或无符号短整型(针对 o、u 和 x) l :长整型(针对 d、i 和 n),或无符号长整型(针对 o、u 和 x),或双精度型(针对 e、f 和 g) L :长双精度型(针对 e、f 和 g)

type

一个字符,指定了要被读取的数据类型以及数据读取方式。具体参见下一个表格。

sscanf 类型说明符:

类型

合格的输入

参数的类型

c

单个字符:读取下一个字符。如果指定了一个不为 1 的宽度 width,函数会读取 width 个字符,并通过参数传递,把它们存储在数组中连续位置。在末尾不会追加空字符。

char *

d

十进制整数:数字前面的 + 或 - 号是可选的。

int *

e,E,f,g,G

浮点数:包含了一个小数点、一个可选的前置符号 + 或 -、一个可选的后置字符 e 或 E,以及一个十进制数字。两个有效的实例 -732.103 和 7.12e4

float *

o

八进制整数。

int *

s

字符串。这将读取连续字符,直到遇到一个空格字符(空格字符可以是空白、换行和制表符)。

char *

u

无符号的十进制整数。

unsigned int *

x,X

十六进制整数。

int *

  • 附加参数
  • -- 这个函数接受一系列的指针作为附加参数,每一个指针都指向一个对象,对象类型由 format 字符串中相应的 % 标签指定,参数与 % 标签的顺序相同。
  • 针对检索数据的 format 字符串中的每个 format 说明符,应指定一个附加参数。如果您想要把 sscanf 操作的结果存储在一个普通的变量中,您应该在标识符前放置引用运算符(&),例如:
  • int n;
    sscanf (str,"%d",&amp;n);

返回值

如果成功,该函数返回成功匹配和赋值的个数。如果到达文件末尾或发生读错误,则返回 EOF。

strcmp( )

C 库函数 int strcmp(const char *str1, const char *str2)str1 所指向的字符串和 str2 所指向的字符串进行比较。

声明

下面是 strcmp() 函数的声明。

int strcmp(const char *str1, const char *str2)

参数

  • str1 -- 要进行比较的第一个字符串。
  • str2 -- 要进行比较的第二个字符串。

返回值

该函数返回值如下:

  • 如果返回值小于 0,则表示 str1 小于 str2。
  • 如果返回值大于 0,则表示 str1 大于 str2。
  • 如果返回值等于 0,则表示 str1 等于 str2。

remove()

描述

C 库函数 int remove(const char *filename) 删除给定的文件名 filename,以便它不再被访问。

声明

下面是 remove() 函数的声明。

int remove(const char *filename)

参数

  • filename -- 这是 C 字符串,包含了要被删除的文件名称。

返回值

如果成功,则返回零。如果错误,则返回 -1,并设置 errno。

getchar()

描述

C 库函数 int getchar(void) 从标准输入 stdin 获取一个字符(一个无符号字符)。这等同于 getc 带有 stdin 作为参数。

声明

下面是 getchar() 函数的声明。

int getchar(void)

参数

  • NA

返回值

该函数以无符号 char 强制转换为 int 的形式返回读取的字符,如果到达文件末尾或发生读错误,则返回 EOF。

strftime()

描述

C 库函数 size_t strftime(char *str, size_t maxsize, const char *format, const struct tm *timeptr) 根据 format 中定义的格式化规则,格式化结构 timeptr 表示的时间,并把它存储在 str 中。

声明

下面是 strftime() 函数的声明。

size_t strftime(char *str, size_t maxsize, const char *format, const struct tm *timeptr)

参数

  • str -- 这是指向目标数组的指针,用来复制产生的 C 字符串。
  • maxsize -- 这是被复制到 str 的最大字符数。
  • format -- 这是 C 字符串,包含了普通字符和特殊格式说明符的任何组合。这些格式说明符由函数替换为表示 tm 中所指定时间的相对应值。格式说明符是:

说明符

替换为

实例

%a

缩写的星期几名称

Sun

%A

完整的星期几名称

Sunday

%b

缩写的月份名称

Mar

%B

完整的月份名称

March

%c

日期和时间表示法

Sun Aug 19 02:56:02 2012

%d

一月中的第几天(01-31)

19

%H

24 小时格式的小时(00-23)

14

%I

12 小时格式的小时(01-12)

05

%j

一年中的第几天(001-366)

231

%m

十进制数表示的月份(01-12)

08

%M

分(00-59)

55

%p

AM 或 PM 名称

PM

%S

秒(00-61)

02

%U

一年中的第几周,以第一个星期日作为第一周的第一天(00-53)

33

%w

十进制数表示的星期几,星期日表示为 0(0-6)

4

%W

一年中的第几周,以第一个星期一作为第一周的第一天(00-53)

34

%x

日期表示法

08/19/12

%X

时间表示法

02:50:06

%y

年份,最后两个数字(00-99)

01

%Y

年份

2012

%Z

时区的名称或缩写

CDT

%%

一个 % 符号

%

  • timeptr

-- 这是指向 tm 结构的指针,该结构包含了一个被分解为以下各部分的日历时间:

struct tm {
int tm_sec; /* 秒,范围从 0 到 59 */
int tm_min; /* 分,范围从 0 到 59 */
int tm_hour; /* 小时,范围从 0 到 23 */
int tm_mday; /* 一月中的第几天,范围从 1 到 31 */
int tm_mon; /* 月份,范围从 0 到 11 */
int tm_year; /* 自 1900 起的年数 */
int tm_wday; /* 一周中的第几天,范围从 0 到 6 */
int tm_yday; /* 一年中的第几天,范围从 0 到 365 */
int tm_isdst; /* 夏令时 */
};

返回值

如果产生的 C 字符串小于 size 个字符(包括空结束字符),则会返回复制到 str 中的字符总数(不包括空结束字符),否则返回零。

atoi()

描述

C 库函数 int atoi(const char *str) 把参数 str 所指向的字符串转换为一个整数(类型为 int 型)。

声明

下面是 atoi() 函数的声明。

int atoi(const char *str)

参数

  • str -- 要转换为整数的字符串。

返回值

该函数返回转换后的长整数,如果没有执行有效的转换,则返回零。

参考文档

posted @ 2024-05-28 17:44  舟清颺  阅读(93)  评论(0编辑  收藏  举报