2、文件操作的主要接口API

本文介绍了基于Linux的嵌入式应用编程基础知识,包括应用编程概念、文件I/O操作、操作系统API使用等内容。重点讲解了如何利用Linux系统API进行文件读写操作,并探讨了文件描述符、虚拟文件系统等核心概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.1 什么是应用编程

(1)典型的嵌入式产品就是基于嵌入式Linux操作系统来工作的。典型的嵌入式产品研发过程是:第一步让Linux系统在硬件上跑起来(系统移植工作),第二步基于Linux系统来开发应用程序实现产品功能。
(2)基于Linux去做应用编程,其实就是通过调用Linux的系统API来实现应用需要完成的任务。
(3)熟悉Linux系统的API(《Unix高级编程》),进程和线程,文件的读写,中断,操作系统的基本原理。
(4)这里一定要弄清楚一些基本的概念,因为我们编写应用程序不一定是在Linxu操作系统上,还有可能会在其它系统上编写,所以弄清楚一些基本概念和原理是最重要的,当我们运用到什么系统的时候再去熟悉这个系统提供的一些接口函数也不迟,只要你概念和原理很清楚,那么其它的都是比较容易的。
(5)应用编程其实不用对原理的每一个细节都了解得很清楚,你只需要在宏观上对整个流程有一个认识,知道大概的一个基本原理,会使用API函数就可以完成功能了。如果你想要详细了解的话,可以去看《Linux内核原理》详细了解它的机制,然后去看它的内核代码,看是如何实现的。

1.2 文件IO

(1)IO就是input/output,输入/输出。文件IO的意思就是读写文件。

1.3 什么是操作系统API

(1)API是一些函数,这些函数是由Linux系统提供支持的,由应用层程序来使用。
(2)应用层程序通过调用API来调用操作系统中的各种功能来干活。
(3)学习一个操作系统,其实就是学习使用这个操作系统的API。
(4)今天我们要使用Linux系统来读写文件,手段就是学习Linux系统API中和文件IO有关的几个。
(5)操作系统可以完成很多事情,有很强大的功能,它会将这些强大的功能封装成一个一个的接口API,向上提供给开发者或者程序使用。我们在编写基于某个操作系统的应用程序时,就需要调用这个操作系统提供的API接口来实现一些功能。不管是Linux或者是windows或者是其它操作系统,它都封装了它自己操作系统功能的API。
(6)操作系统的主要功能是为管理硬件资源和为应用程序开发人员提供良好的环境,但是计算机系统的各种硬件资源是有限的,因此为了保证每一个进程都能安全的执行。处理器设有两种模式:“用户模式”与“内核模式”。一些容易发生安全问题的操作都被限制在只有内核模式下才可以执行,例如I/O操作,修改基址寄存器内容等。而连接用户模式和内核模式的接口称之为系统调用。应用程序代码运行在用户模式下,当应用程序需要实现内核模式下的指令时,先向操作系统发送调用请求。操作系统收到请求后,执行系统调用接口,使处理器进入内核模式。当处理器处理完系统调用操作后,操作系统会让处理器返回用户模式,继续执行用户代码。
(7)进程的虚拟地址空间可分为两部分,内核空间和用户空间。内核空间中存放的是内核代码和数据,而进程的用户空间中存放的是用户程序的代码和数据。不管是内核空间还是用户空间,它们都处于虚拟空间中,都是对物理地址的映射。
(8)应用程序中实现对文件的操作过程就是典型的系统调用过程。

1.4 Linux常用文件IO接口

(1)open(), close(), write(), read(), lseek()

1.5 文件操作的一般步骤

(1)在Linux系统中要操作一个文件,一般是先open打开一个文件,得到一个文件描述符,然后对文件进行读写操作(或其他操作),最后close关闭文件即可。
(2)强调一点:我们对文件进行操作时,一定要先打开文件,打开成功后才能去操作。(如果打开本身失败,后面就不用操作了),最后读写完成之后一定要close关闭文件,否则可能会造成文件损坏。
(3)文件平时是存放在块设备(硬盘、U盘、SD卡等)中的文件系统中的,我们把这种文件叫静态文件。当我们去open打开一个文件时,Linux内核做的操作包括:内核在进程中建立了一个打开文件的数据结构,记录下来我们打开的这个文件,内核在内存中申请一段内存,并且将静态文件的内容从块设备中读取到内存中特定地址管理存放(叫动态文件)。
(4)打开文件后,以后对这个文件的读写操作,都是针对内存中这一份动态文件的,而并不是针对静态文件的。当我们对动态文件进行读写后,此时内存中的动态文件和块设备中的静态文件就不同步了,当我们close关闭动态文件时,close内部内核将内存中的动态文件的内容去更新(同步)块设备中的静态文件。
(5)常见的一些现象:第一个:打开一个大文件时比较慢。第二个:我们写了一半的文件,如果没有点保存直接关机/断电,重启后文件内容丢失。
(6)为什么要这么设计?因为块设备本身有读写限制(回忆NnadFlash、SD等块设备的读写特征),本身对块设备进行操作非常不灵活,而内存可以按字节为单位来操作,而且可以随机操作(内存就叫RAM,random),很灵活。所以内核设计文件操作时就这么设计了。

1.6 虚拟文件系统

(1)一个操作系统可以支持多种底层不同的文件系统(比如NTFS, FAT, ext3, ext4),为了给内核和用户进程提供统一的文件系统视图,Linux在用户进程和底层文件系统之间加入了一个抽象层,即虚拟文件系统(Virtual File System, VFS),进程所有的文件操作都通过VFS,由VFS来适配各种底层不同的文件系统,完成实际的文件操作。通俗的说,VFS就是定义了一个通用文件系统的接口层和适配层,一方面为用户进程提供了一组统一的访问文件,目录和其他对象的统一方法,另一方面又要和不同的底层文件系统进行适配。如图所示:
在这里插入图片描述

1.7 I/O 缓冲区

(1)如高速缓存(cache)产生的原理类似,在I/O过程中,读取磁盘的速度相对内存读取速度要慢的多。因此为了能够加快处理数据的速度,需要将读取过的数据缓存在内存里。而这些缓存在内存里的数据就是高速缓冲区(buffer cache),下面简称为“buffer”。具体来说,buffer(缓冲区)是一个用于存储速度不同步的设备或优先级不同的设备之间传输数据的区域。一方面,通过缓冲区,可以使进程之间的相互等待变少,从而使从速度慢的设备读入数据时,速度快的设备的操作进程不发生间断。另一方面,可以保护硬盘或减少网络传输的次数。
(2)buffer和cache是两个不同的概念:cache是高速缓存,用于CPU和内存之间的缓冲;buffer是I/O缓存,用于内存和硬盘的缓冲;简单的说,cache是加速“读”,而buffer是缓冲“写”,前者解决读的问题,保存从磁盘上读出的数据,后者是解决写的问题,保存即将要写入到磁盘上的数据。

1.8文件描述符

(1)文件描述符其实实质是一个数字,这个数字在一个进程中表示一个特定的含义,当我们open打开一个文件时,操作系统在内存中构建了一些数据结构来表示这个动态文件,然后返回给应用程序一个数字作为文件描述符,这个数字就和我们内存中维护这个动态文件的这些数据结构挂钩绑定上了,以后我们应用程序如果要操作这一个动态文件,只需要用这个文件描述符进行区分。
(2)一句话讲清楚文件描述符:文件描述符就是用来区分一个程序打开的多个文件的。
(3)文件描述符的作用域就是当前的进程,出了当前进程这个文件描述符就没有意义了。

说明:本专栏内容一部分来自于朱有鹏老师的课堂笔记,一部分来自于其他人博客的内容,一部分来自于自己的理解和领悟,一部分来自于专业书籍内容,如有错误,欢迎指正。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

非主流的豆瓣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值