1.应用编程框架介绍
1.1什么是应用编程
①学习顺序依次是:裸机、C高级、uboot和系统移植、Linux应用编程和网络编程、驱动
②典型的嵌入式产品就是基于嵌入式Linux操作系统来工作的。典型的嵌入式产品的研发过程就是;第一步让Linux系统在硬件上跑起来(系统移植工作),第二步基于Linux系统来开发应用程序实现产品功能
③基于Linux去做应用程序编程,其实就是通过调用Linux的系统API来实现应用需要完成的任务。
1.2大纲规划
1.3课程设计思路
(1)通过本课程9个小时的学习,学会如何使用Linux系统提供的API(和C库函数)
来实现一定的功能,通过学习对应用层的编程所有掌握来配合后面的驱动的学习
(2)如果希望深入学习Linux应用尤其是网络编程知识,可以去看一些专门介绍这一块的书
1.4什么是文件IO
(1)IO就是input/output,输入/输出。
2.文件操作的主要接口API
2.1 什么是操作系统API
(1)API是一些函数,这些函数是有Linux系统提供支持的,有应用层程序来使用。
(2)应用层程序通过调用API来调用操作系统中的各种功能,来干活
(3)学习一个操作系统,其实就是学习使用这个操作系统的API。
(4)今天要使用Linux系统来读写文件,手段就是学习Linux系统API和文件IO有关的几个
2.2 Linux常用文件IO接口
(1)open、close、write、read、lseek
2.3 文件操作的一般步骤
(1)在Linux系统中操作一个文件,一般是先open打开一个文件,得到一个文件描述符,然后对文件进行读写操作,最后关闭文件即可
(2)强调一点:我们对文件进行操作时,一定要先打开文件,打开成功后才能操作
(如果打开失败,后面就不用操作了);最后读写完成之后一定要close关闭文件,否则可能会造成文件损坏。
(3)文件在平时是存放在块设备中的文件系统中的,我们把这种文件叫静态文件。当我们去open打开一个文件时,Linux内核做的操作包括:内核在进程中建立了一个打开文件的数据结构,记录下我们打开的这个文件;内核在内存中申请一段内存,并且将静态文件的内容从块设备中读取到内存中特定地址管理存放(叫动态内存文件)。
(4) 打开文件后,以后对这个文件的读写操作,都是针对内存中这一份动态文件的,而并不是针对静态文件的。当我们对动态文件进行读写后,此时内存中的动态文件和块设备中的静态文件就不同步了,当我们close关闭动态文件时,close内部内核将内存中的动态文件的内容去更新(同步)块设备中的静态文件。
(5)常见的一些现象:
第一个:打开一个大文件时比较慢
第二个:我们写了一半的文件,如果没有点击保存直接关机/断电,重启后文件内容丢失。
(6)为什么要这么设计?
因为块设备本身有读写限制(回忆Nandflash、SD等块设备的读写特征),本身对块设备进行操作非常不灵活。而内存可以按字节为单位来操作,而且可以随机操作(内存就叫RAM,random)
2.4 重要概念:文件描述符
(1)文件描述符其实实质是一个数字,这个数字在一个进程中表示一个特定的含义,当我们open打开一个文件时,操作系统在内存中构建了一些数据结构来表示这个动态文件,然后返回给应用程序一个数字作为文件描述符,这个数字就和我们内存中维护这个动态文件的这些数据结构挂钩绑定上了,以后我们应用程序如果要操作这个一个动态文件,只需要用这个文件描述符进行区分。
3.一个简单的文件读写实例
3.1打开文件和关闭文件
3.2实时查man手册
3.3读取文件内容
(1)ssize_t read(int fd,void *buf,size_t count);
fd:表示文件描述符,要读取那个文件,fd一般由前面的open返回得到file desp
buf:是应用程序自己提供的一段内存缓冲区,用来存储读出的内容
count:是我们要读取到的字节数
返回值ssize_t类型是Linux内核用typedef重定义的一个类型(其实就是int),返回值表示成功读取的字节数。
#include#include #include #include #include int main(int argc,char argv[]) { int fd = -1; fd = open("a.txt",O_RDWR); char buf[100]={0}; int ret = -1; if(fd == -1) { perror("open error"); } else { printf("open success:fd:%d.n",fd); } //读文件 ret = read(fd,buf,20); if(ret < 0) { printf("read error"); } else { printf("read %d byte",ret); printf("file content:[%s].n",buf); } close(fd); return 0; }
3.4向文件中写入
ssize_t write(int fd,const void *buf,size_t count);
(1)写入用write系统调用,write的原型和理解方法和read相似
(2)注意const在buf前面的作用,结合C语言高级专题中的输入型参数和输出型参数一节来理解。
(3)注意buf的指针类型为void
const说明buf里面的内容只会被读不会被写,说明只会被输入不会被输出
#include#include #include #include #include #include int main(int argc,char argv[]) { int fd = -1; fd = open("a.txt",O_RDWR); char buf[100]={0}; char writebuf[20]="I LOVE LINUX"; int ret = -1; if(fd == -1) { perror("open error"); } else { printf("open success:fd:%d.n",fd); } ret = write(fd,writebuf,strlen(writebuf)); if(ret < 0) { printf("write error"); } else { printf("write success,wirtten %d charn",ret); } ret = read(fd,buf,20); if(ret < 0) { printf("read error"); } else { printf("read %d byte",ret); printf("file content:[%s].n",buf); } close(fd); return 0; }



