“嵌入式Linux基础实验”实验报告

Linux下文件IO基础

实验心得

通过本次实验,我学到了Linux下文件IO的相关知识 ,Linux系统调用、所有打开文件要由文件描述符引用。文件描述符是一个非负整数。当打开一个现存文件或创建一个新文件时,内核向进程返回一个文件描述符。当写一个文件时,用open或create返回的文件描述符标识该文件,将其作为参数传送给read或write。对创客学院中的视频讲解有了实践动手操作能力,加深了对其的理解和应用。

1. 课程说明

本节课程介绍 Linux 系统的文件 IO,除了介绍其基本概念,最主要的是讲解其基本 APIs,包括 open、close、read、write 等等。

2. 环境介绍

本实验环境采用带桌面的Ubuntu Linux环境,实验中会用到桌面上的程序:

1.命令行终端: Linux命令行终端,打开后会进入Bash环境,可以使用Linux命令

2.Firefox及Opera:浏览器,可以用在需要前端界面的课程里,只需要打开环境里写的HTML/JS页面即可

3.gvim:非常好用的Vim编辑器,最简单的用法可以参考课程Vim编辑器

4.gedit及Brackets:如果您对gvim的使用不熟悉,可以用这两个作为代码编辑器,其中Brackets非常适用于前端代码开发

二、文件 I\O 介绍

1. Linux系统调用

Linux系统调用(system call)是指操作系统提供给用户程序的一组“特殊接口”,用户程序可以通过这组“特殊”接口来获得操作系统提供的特殊服务。

为了更好的保护内核空间,将程序的运行空间分为内核空间和用户空间,他们运行在不同的级别上,在逻辑上是相互隔离的。在Linux中,用户程序不能直接访问内核提供的服务,必须通过系统调用来使用内核提供的服务。

Linux中的用户编程接口(API)遵循了UNIX中最流行的应用编程界面标准——POSIX。这些系统调用编程接口主要是通过C库(libc)实现的。

2. 文件描述符

对内核而言,所有打开文件都由文件描述符引用。文件描述符是一个非负整数。当打开一个现存文件或创建一个新文件时,内核向进程返回一个文件描述符。当写一个文件时,用open或create返回的文件描述符标识该文件,将其作为参数传送给read或write。

在POSIX应用程序中,整数0、1、2应被代换成符号常数:

STDIN_FILENO(标准输入,默认是键盘)

STDOUT_FILENO(标准输出,默认是屏幕)

STDERR_FILENO(标准错误输出,默认是屏幕)

这些常数都定义在头文件<unistd.h>中,文件描述符的范围是0~OPEN_MAX。早期的UNIX版本采用的上限值是19(允许每个进程打开20个文件), 现在很多系统则将其增加至256。

可用的文件I\O函数很多,包括:打开文件,读文件,写文件等。大多数Linux文件I\O只需要用到5个函数:open,read,write,lseek以及close。

四、基本API

1.open

需要包含的头文件:<sys/types.h>, <sys/stat.h>, <fcntl.h>

函数原原型:int open(const str * pathname,int oflag, [...,mode_t mode])

功能:打开文件

返回值:成功则返回文件描述符,出错返回-1 参数:

pathname: 打开或创建的文件的全路径名 oflag:可用来说明此函数的多个选择项, 详见后。 mode:对于open函数而言,仅当创建新闻件时才使用第三个参数,表示新建文件的权限设置。

详解oflag参数: oflag 参数由O_RDONLY(只读打开)、O_WRONLY(只写打开)、O_RDWR(读写打开)中的一个于下列一个或多个常数 O_APPEND: 追加到文件尾 O_CREAT: 若文件不存在则创建它。使用此选择项时,需同时说明第三个参数mode,用其说明新闻件的访问权限 O_EXCL: 如果同时指定O_CREAT,而该文件又是存在的,报错;也可以测试一个文件是否存在,不存在则创建。 O_TRUNC: 如果次文件存在,而且为读写或只写成功打开,则将其长度截短为0 O_SYNC: 使每次write都等到物理I\O操作完成

用open创建一个文件:

图片描述

如果当前目录下以存在test.txt,屏幕上就会打印“open error”;不存在则创建该文件,并打印“open success”

图片描述

2. read

需要包含的头文件:<unistd.h>

函数原型:ssize_t read(int fd,void * buf,size_t count)

功能:从打开的文件中读取数据。 返回值:实际读到的字节数;已读到文件尾返回0,出错的话返回-1, ssize_t是系统头文件中用typedef定义的数据类型相当于signed int 参数: fd:要读取的文件的描述符 buf:得到的数据在内存中的位置的首地址 count:期望本次能读取到的最大字节数。size_t是系统头文件中用typedef定义的数据类型,相当于unsigned int

3.read

需要包含的头文件:<unistd.h>

函数原型:ssize_t read(int fd,const void * buf,size_t count)

功能:向打开的文件写数据 返回值:写入成功返回实际写入的字节数,出错返回-1

不得不提的是,返回-1的常见原因是:磁盘空间已满,超过了一个给定进程的文件长度 参数: fd:要写入文件的文件描述符 buf:要写入文件的数据在内存中存放位置的首地址 count:期望写入的数据的最大字节数

read和write使用范例:

图片描述

图片描述

4. close

需要包含的头文件:<unistd.h>

函数原型:int close(int filedes)

功能:关闭一个打开的文件

参数:需要关闭文件的文件描述符

当一个进程终止的时候,它所有的打开文件都是由内核自动关闭。很多程序都使用这一功能而不显式地调用close关闭一个已打开的文件。 但是,作为一名优秀的程序员,应该显式的调用close来关闭已不再使用的文件。

5.sleek

每个打开的文件都有一个“当前文件偏移量”,是一个非负整数,用以度量从文件开始处计算的字节数。通常,读写操作都是从当前文件偏移量处开始,并使偏移量增加所读或写的字节数。默认情况下,你打开一个文件时(open),除非指定O_APPEND参数,不然位移量被设为0。

需要包含的头文件:<sys/types.h>, <unistd.h>

函数原型:off_t lseek (int filesdes,off_t offset,int whence)

功能:设置文件内容读写位置 返回值:成功返回新的文件位移,出错返回-1;同样off_t是系统头文件定义的数据类型,相当于signed int 参数:

1.whence是SEEK_SET, 那么该文件的位移量设置为据文件开始处offset个字节

2.whence是SEEK_CUR, 那么该文件的位移量设置为当前值加offset。offset可为正或负

3.whence是SEEK_END, 那么该文件的位移量设置为文件长度加offset。offset可为正或负

图片描述

图片描述

最新评论
暂无评论~