1. Linux文件I/O编程基础
作为一名嵌入式Linux开发者,文件I/O操作是我们日常开发中最基础也最常用的功能之一。在Linux系统中,文件I/O主要分为两种方式:系统调用(如open/read/write)和标准库函数(如fopen/fread/fwrite)。这两种方式各有特点,适用于不同的场景。
1.1 文件I/O的基本概念
在Linux系统中,一切皆文件。这不仅包括普通的文本文件、二进制文件,还包括设备文件、管道、套接字等。文件I/O操作的核心就是对这些"文件"进行读写操作。
Linux提供了两种主要的文件I/O接口:
- 低级I/O:直接使用系统调用(如open、read、write、close等)
- 高级I/O:使用C标准库函数(如fopen、fread、fwrite、fclose等)
这两种方式各有优缺点,我们需要根据具体场景选择合适的接口。
1.2 文件描述符与文件流
在使用低级I/O时,Linux内核会为每个打开的文件分配一个文件描述符(File Descriptor),这是一个非负整数,用于标识打开的文件。标准输入、标准输出和标准错误分别对应文件描述符0、1和2。
而在使用高级I/O时,C标准库会维护一个FILE结构体指针(文件流),它封装了文件描述符并提供了缓冲机制,使得I/O操作更加高效。
2. 低级I/O系统调用详解
2.1 open系统调用
open系统调用用于打开或创建一个文件,其函数原型如下:
c复制#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
flags参数指定了打开文件的方式,常用的有以下几种:
- O_RDONLY:只读方式打开
- O_WRONLY:只写方式打开
- O_RDWR:读写方式打开
- O_CREAT:如果文件不存在则创建
- O_TRUNC:如果文件存在且以写方式打开,则将其长度截断为0
- O_APPEND:每次写操作都追加到文件末尾
mode参数指定了创建文件时的权限,它是一个八进制数,常用的权限设置有:
- S_IRWXU:用户(文件所有者)具有读、写、执行权限
- S_IRUSR:用户具有读权限
- S_IWUSR:用户具有写权限
- S_IXUSR:用户具有执行权限
- S_IRWXG:组用户具有读、写、执行权限
- S_IROTH:其他用户具有读权限
2.2 read/write系统调用
read和write系统调用用于对打开的文件进行读写操作:
c复制#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
ssize_t write(int fd, const void *buf, size_t count);
read函数从文件描述符fd对应的文件中读取最多count字节的数据到buf指向的缓冲区中,返回实际读取的字节数。如果返回0表示已到达文件末尾,返回-1表示出错。
write函数将buf指向的缓冲区中的最多count字节数据写入文件描述符fd对应的文件中,返回实际写入的字节数。返回-1表示出错。
2.3 close系统调用
close系统调用用于关闭一个打开的文件描述符:
c复制#include <unistd.h>
int close(int fd);
关闭文件描述符后,该文件描述符不再引
