待我6.19中期答辩完再来更新......
参考文章:
[1] 《嵌入式Linux开发教程(上册)》
[2] Linux文件IO操作函数概述
[3] 详解linux文件IO
Linux下的输入/输出(I/O),设计成“一切皆文件”,把各种各样的输出/出入(I/O)当成文件来操作,统一用文件I/O函数的形式提供给应用程序调用。
1、Linux文件I/O概述
Linux文件按其代表的具体对象,可分类为:
- 普通文件,即一般意义上的文件、磁盘文件;
- 设备文件,代表的是系统中一个具体的设备;
- 管道文件、FIFO文件,一种特殊文件,常用于进程间通信;
- 套接字(socket)文件,主要用在网络通信方面。
文件I/O常用操作方法有“打开”、“关闭”、“读”和“写”等。只要是文件,都可以用这套方法操作。
系统提供了文件I/O的应用程序接口(API),以函数的形式提供给应用程序调用。打开文件对应的函数是open(),读文件对应的函数是read(),写文件对应的函数是write(),关闭文件对应的函数是close()。
2、文件描述符
文件描述符fd(file descriptor)是进程中代表某个文件的整数,又称为文件句柄(file handle)。
文件描述符的作用:类似于生活中排队取的号牌,业务员(进程)通过叫号(引用文件描述符)就能找到办事的人(打开的文件)。
有效的文件描述符取值范围从0开始,直到系统的某个界限值。这些指定范围的整数,实际上是进程文件描述符的索引。文件描述表是进程用来保存他所打开文件信息的、有操作系统维护的一个登记表,用户不能直接访问这个登记表。文件描述符的取值范围反映了文件描述符标的大小,表示这个进程最多可以同时打开多少个文件。
在Linux中,可以使用ulimit -n查询到这个数值的大小。
对于内核而言,进程锁打开的文件都有文件描述符引用。当进程打开一个文件或者创建一个新文件时,内核返回一个文件描述符给进程。
通常情况下,文件描述符0、1、2在进程启动时已被占用,代表进程在启动过程中打开的文件。通常文件描述符0、1、2在桌面系统与嵌入式系统上代表的文件如下:
文件描述符 | 含义 | 桌面/服务器Linux | 嵌入式Linux |
0 | 标准输入(stdin) | 键盘 | 串口终端 |
1 | 标准输出(stdout ) | 终端屏幕 | 串口终端 |
2 | 标准错误(stderr) | 终端屏幕 | 串口终端 |
3、常用文件I/O操作和函数
3.1 open
进行文件I/O操作时,要先打开对应的文件,可以调用open()函数,它返回的文件描述符fd代表打开的文件,后续操作通过引用该文件描述符fd来表示对这个文件的操作。open()函数原型在<fcntl.h>文件中定义:
int open(const char *pathname, int flags, ... /* mode_t mdoe */)
参数 | 打开文件标志 | 含义 |
pathname | — | C字符串形式的文件名 |
3.2 close
3.3 read
3.4 write
3.5 fsync
3.6 文件操作范例
3.7 lseek
3.8 ioctl
4、I/O操作和蜂鸣器