嵌入式Linux应用程序开发中的文件IO编程
一、Linux系统调用及API
1. 系统调用:
Linux分为内核空间和用户空间,用户空间无法直接访问内核空间。内核通过系统调用为用户提供服务,大约有250个左右的系统调用,可以分为进程控制、进程间通信、文件系统控制、系统控制、存储管理、网络管理、socket控制、用户管理等几类。
2. C库API:
C库提供了一些API,遵循一定的标准,供用户使用。用户可以直接调用系统调用,也可以调用C库提供的API。
二、Linux中文件及文件描述符概述
Linux主要有四种文件类型:普通文件、目录文件、链接文件和设备文件。在Linux中,使用文件描述符操作文件,尤其对于用户态来说更是如此。文件描述符是一个非负的整数,是个索引值,在打开文件时动态分配,优先分配未使用的最小描述符。进程打开时,默认会打开三个文件描述符,分别指向标准输入、标准输出和标准错误。
三、底层文件IO操作
3.1 基本文件操作
3.1.1 函数说明:
有五个基本函数,不带缓冲,属于POSIX标准,包括open、read、write、lseek和close。
3.2 文件锁
3.2.1 共享问题:
多个进程操作同一个文件时,可能会造成数据混乱的情况。为了解决这个问题,引入了记录锁,实现对文件的独占操作。
3.2.2 fcntl()函数:
当多个进程操作同一文件时,应该上锁以保证数据的完整性。在进程信息中存放了锁的信息,关闭进程或者关闭文件时,该文件的锁会自动关闭。使用F_SETLK来设置锁,并根据返回值判断是否设置成功。
3.3 多路复用
3.3.1 IO模型:
阻塞IO会导致进程挂起,直到相关数据到达后才返回。非阻塞IO则不会等待数据到达而是立即返回,通过轮询各IO,超时等待的方式处理IO操作。select和poll就属于此类信号驱动IO。
3.3.2 select函数:
select函数用于对文件描述符进行分类处理,需要使用一些宏定义来清除、添加和判断文件描述符集中的文件描述符。
版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。