嵌入式软件开发技术:第2章 嵌入式文件IO编程

举报
资源描述
嵌入式编程技术嵌入式编程技术课程总体情况成绩:期末考试80%,平时10(考勤+作业),实验10%学时安排:教师授课32学时,实验32学时教材:从实践中学嵌入式Linux应用程序开发重点内容:嵌入式文件I/O编程、多任务编程、进程间通信、多线程编程、网络编程、设备驱动编程。补充内容:QT编程(GUI)、BOA移植及编程学习方法:理解+实践3 第第2章章 嵌入式文件嵌入式文件I/O编程编程 在在Linux系统中,大部分系统中,大部分设备设备都会抽象成一个文件,这都会抽象成一个文件,这样对它们的操作就像对文件的操作一样。在嵌入式应用开样对它们的操作就像对文件的操作一样。在嵌入式应用开发中,文件发中,文件I/O编程是最常用也是最基本的内容。编程是最常用也是最基本的内容。4 第第2章章 嵌入式文件嵌入式文件I/O编程编程1.系统调用及用户编程接口系统调用及用户编程接口系统调用、用户编程接口、系统命令的概念系统调用、用户编程接口、系统命令的概念2.Linux文件文件I/O系统概述系统概述虚拟文件系统虚拟文件系统VFS、Linux中文件及文件描述符中文件及文件描述符3.底层文件底层文件I/O操作操作基本文件操作、文件锁、多路复用基本文件操作、文件锁、多路复用4.嵌入式嵌入式Linux串口应用编程串口应用编程5.标准标准I/O编程编程6.文件读写及上锁综合实例文件读写及上锁综合实例5 2.1.1 系统调用系统调用 2.1 Linux系统调用及用户编程接口系统调用及用户编程接口n系统调用是指操作系统提供给用户程序调用的一组系统调用是指操作系统提供给用户程序调用的一组“特殊特殊”接口,用户程序可以通过这组接口,用户程序可以通过这组“特殊特殊”接口获得操作系接口获得操作系统内核提供的服务。统内核提供的服务。例如用户可以通过进程控制相关的系例如用户可以通过进程控制相关的系统调用来创建进程、实现进程之间的通信等。统调用来创建进程、实现进程之间的通信等。n在在Linux中,为了更好地保护内核空间,将程序的运行空中,为了更好地保护内核空间,将程序的运行空间分为内核空间和用户空间(也称为内核态和用户态),间分为内核空间和用户空间(也称为内核态和用户态),用户进程在通常情况下不允许访问内核数据,也无法使用用户进程在通常情况下不允许访问内核数据,也无法使用内核函数,只能在用户空间操作用户数据,调用用户空间内核函数,只能在用户空间操作用户数据,调用用户空间的函数。的函数。6 2.1.1 系统调用系统调用 2.1 Linux系统调用及用户编程接口系统调用及用户编程接口nLinux系统调用非常精简,它继承了系统调用非常精简,它继承了Unix系统调用中最基系统调用中最基本的部分。本的部分。n这些系统调用按照功能逻辑大致可以分为这些系统调用按照功能逻辑大致可以分为进程控制、进程进程控制、进程间通信、文件系统控制、存储管理、网络管理、套接字控间通信、文件系统控制、存储管理、网络管理、套接字控制、用户管理制、用户管理等几类。等几类。7 2.1.2 用户编程接口用户编程接口 2.1 Linux系统调用及用户编程接口n系统调用并不直接与程序员进行交互,实际使用中程系统调用并不直接与程序员进行交互,实际使用中程序员调用的通常是序员调用的通常是用户编程接口用户编程接口(API)。)。n例如:创建进程的例如:创建进程的API函数函数fork()对应于内核空间的对应于内核空间的sys_fork()系统调用。系统调用。n一些一些API函数需要几个系统调用来共同完成函数的功函数需要几个系统调用来共同完成函数的功能能,也有一些也有一些API函数不需要调用系统调用。函数不需要调用系统调用。8 2.1.2 用户编程接口用户编程接口 2.1 Linux系统调用及用户编程接口n在在Linux中,用户编程接口(中,用户编程接口(API)遵循了在)遵循了在Unix中最流中最流行的应用编程界面标准行的应用编程界面标准POSIX(Portable Operating System Interface)标准。)标准。POSIX标准是由标准是由IEEE和和ISO/IEC共同开发的标准系统。该标准基于当时现有的共同开发的标准系统。该标准基于当时现有的Unix实践和经验,描述了操作系统的系统调用编程接口实践和经验,描述了操作系统的系统调用编程接口(实际上就是(实际上就是API),用于),用于保证应用程序可以在源代码一保证应用程序可以在源代码一级上在多种操作系统上移植级上在多种操作系统上移植运行。这些系统调用编程接运行。这些系统调用编程接口主要是通过口主要是通过C库(库(libc)实现的。)实现的。9 2.1.3 系统命令系统命令 2.1 Linux系统调用及用户编程接口系统调用及用户编程接口 系统命令相对系统命令相对API更高了一层,它实际上一个可执行程更高了一层,它实际上一个可执行程序,它的内部引用了用户编程接口(序,它的内部引用了用户编程接口(API)来实现相应的)来实现相应的功能功能,它们之间的关系如图:,它们之间的关系如图:10 2.2.1 虚拟文件系统虚拟文件系统Linux系统成功的关键因素之一就是具有与其他操系统成功的关键因素之一就是具有与其他操作系统和谐共存的能力。作系统和谐共存的能力。Linux的文件系统由两层结构的文件系统由两层结构构建。第一层是虚拟文件系统(构建。第一层是虚拟文件系统(VFS),第二层是各种),第二层是各种不同的具体的文件系统。不同的具体的文件系统。2.2 Linux文件文件I/O系统概述系统概述11 2.2.1 虚拟文件系统虚拟文件系统2.2 Linux文件文件I/O系统概述系统概述 12 2.2.2 Linux中文件及文件描述符中文件及文件描述符 Linux目前支持目前支持7种文件类型:种文件类型:普通文件、目录文件、普通文件、目录文件、链接文件、块设备文件、字符设备文件、管道文件、套接链接文件、块设备文件、字符设备文件、管道文件、套接字文件。字文件。对于对于Linux而言,所有对设备和文件的操作都是使用而言,所有对设备和文件的操作都是使用文件描述符来进行的。文件描述符是一个非负的整数,它文件描述符来进行的。文件描述符是一个非负的整数,它是一个索引值,并指向在内核中每个进程打开文件的记录是一个索引值,并指向在内核中每个进程打开文件的记录表。当打开一个现存文件或创建一个新文件时,内核就向表。当打开一个现存文件或创建一个新文件时,内核就向进程返回一个文件描述符;当需要读写文件时,也需要把进程返回一个文件描述符;当需要读写文件时,也需要把文件描述符作为参数传递给相应的函数。文件描述符作为参数传递给相应的函数。2.2 Linux文件I/O系统概述13 2.2.2 Linux中文件及文件描述符中文件及文件描述符 基于文件描述符的基于文件描述符的I/O操作是操作是Linux中最常用的操作之中最常用的操作之一。例如一个进程启动时,都会打开一。例如一个进程启动时,都会打开3个文件:标准输入、个文件:标准输入、标准输出和标准出错处理。标准输出和标准出错处理。2.2 Linux文件I/O系统概述文件描述符文件描述符宏宏标准输入标准输入0STDIN_FILENO 标准输出标准输出1STDOUT_FILENO 标准出错标准出错2STDERR_FILENO 14 文件文件I/O操作的系统调用主要有操作的系统调用主要有5个函数:个函数:open()、read()、write()、lseek()和和close()。这些函数的特点是。这些函数的特点是不带缓存,直接对文件(包括设备)进行读写操不带缓存,直接对文件(包括设备)进行读写操作。作。这些函数是这些函数是Posix的组成部分,但不是的组成部分,但不是ANSI C的组的组成部分。成部分。2.3 底层文件底层文件I/O操作操作15 2.3.1 基本文件操作基本文件操作open函数是用于打开或创建文件,在打开或创建文件时函数是用于打开或创建文件,在打开或创建文件时可以指定文件的属性及用户的权限等各种参数。可以指定文件的属性及用户的权限等各种参数。所需头文件:所需头文件:#include#include#include 原型:原型:int open(const char*pathname,int flags,int perms)2.3 底层文件底层文件I/O操作操作16 2.3.1 基本文件操作open函数语法要点2.3 底层文件I/O操作17 2.3.1 基本文件操作open函数语法要点2.3 底层文件I/O操作18 2.3.1 基本文件操作close()函数是用于关闭一个被打开的文件。函数是用于关闭一个被打开的文件。close函数语法要点:函数语法要点:2.3 底层文件I/O操作19 2.3.1 基本文件操作read()函数是用于将从指定的文件描述符中读出的数据放函数是用于将从指定的文件描述符中读出的数据放到缓存区中,并返回实际读入的字节数到缓存区中,并返回实际读入的字节数。read函数语法要点:函数语法要点:2.3 底层文件I/O操作20 2.3.1 基本文件操作write()函数是用于向打开的文件写数据,写操作从文件函数是用于向打开的文件写数据,写操作从文件的当前指针位置开始。的当前指针位置开始。write函数语法要点:函数语法要点:2.3 底层文件I/O操作21 2.3.1 基本文件操作lseek()函数是用于在指定的文件描述符中将文件指针定函数是用于在指定的文件描述符中将文件指针定位到相应的位置。位到相应的位置。lseek函数语法要点:函数语法要点:2.3 底层文件I/O操作22 2.3.1 基本文件操作lseek()函数是用于在指定的文件描述符中将文件指针定函数是用于在指定的文件描述符中将文件指针定位到相应的位置。位到相应的位置。lseek函数语法要点:函数语法要点:2.3 底层文件I/O操作23 2.3.1 基本文件操作函数使用示例:函数使用示例:基本功能:基本功能:从一个文件(源文件)中读取最后从一个文件(源文件)中读取最后10KB的数的数据并复制到另一个文件(目标文件)。源文件以只读方据并复制到另一个文件(目标文件)。源文件以只读方式打开,目标文件以只写方式打开。若目标文件不存在,式打开,目标文件以只写方式打开。若目标文件不存在,可以创建并设置权限的初始值为可以创建并设置权限的初始值为644,即文件的所有者可,即文件的所有者可读可写,文件所属组和其他用户只能读。读可写,文件所属组和其他用户只能读。2.3 底层文件I/O操作24 2.3.1 基本文件操作#include#include#include#include#include#include#defineBUFFER_SIZE 1024/*每次读写缓存大小每次读写缓存大小#defineSRC_FILE_NAMEsrc_file/*源文件名源文件名*/#defineDEST_FILE_NAMEdest_file/*目标文件名目标文件名*/#defineOFFSET10240/*复制的数据大小复制的数据大小*/2.3 底层文件I/O操作25 2.3.1 基本文件操作int main()int src_file,dest_file;unsigned char buffBUFFER_SIZE;int real_read_len;/*以只读方式打开源文件以只读方式打开源文件*/src_file=open(SRC_FILE_NAME,O_RDONLY);/*以只写方式打开目标文件,若此文件不存在则创建该文件,访问权限以只写方式打开目标文件,若此文件不存在则创建该文件,访问权限值为值为644*/dest_file=open(DEST_FILE_NAME,O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);if(src_file 0|dest_file 0)write(dest_file,buff,real_read_len);close
展开阅读全文
温馨提示:
金锄头文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
相关资源
正为您匹配相似的精品文档
相关搜索

当前位置:首页 > 中学教育 > 初中教育


电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号