在Linux嵌入式开发中,一切皆是文件,对于这句话的理解,详情见 https://blog.youkuaiyun.com/wenhao_ir/article/details/144488246
既然一切都是文件,那么就很有必须掌握文件操作的基本函数。
open()函数
请详细介绍下Linux嵌入式开发中的open函数。
答:
open 函数是 Linux 系统编程中用于打开文件或设备的一个重要系统调用。它在嵌入式开发中同样有广泛的应用,特别是在操作文件、设备文件、管道或特殊设备时。
open 函数的功能
open 函数用于打开文件(或创建文件),返回一个文件描述符(file descriptor,简称 FD),它是后续文件操作(如读写)所需的关键句柄。关于文件描述符的作用,请见我的另一篇博文 https://blog.youkuaiyun.com/wenhao_ir/article/details/144918793
函数原型
在头文件 <fcntl.h> 中声明:
#include <fcntl.h>
int open(const char *pathname, int flags, ...);
参数说明
-
pathname
要打开的文件或设备文件的路径(可以是绝对路径或相对路径)。关于参数
pathname前面有个const声明的作用,见博文:
C语言中,const 关键字的本质作用是什么?const char *point1、char *const point2、const char *const point3的区别是什么? -
flags
指定打开文件的方式和行为。该参数是一个或多个标志的组合,用 按位或 (|) 操作符连接。- 访问模式(必选,互斥):
O_RDONLY:只读模式打开文件。O_WRONLY:只写模式打开文件。O_RDWR:读写模式打开文件。
- 附加标志:
O_CREAT:如果文件不存在则创建文件(需配合第三个参数mode)。O_EXCL:与O_CREAT一起使用,表示文件已存在时返回错误。O_TRUNC:打开文件时清空其内容(通常与写相关的模式一起使用)。O_APPEND:以追加模式打开文件,写入的数据追加到文件末尾。O_NONBLOCK:以非阻塞模式打开文件(常用于设备文件)。O_SYNC:每次写操作都会立即同步到磁盘。O_NOCTTY:如果路径是终端设备,打开时不会成为该设备的控制终端。
- 访问模式(必选,互斥):
-
mode(可选,针对O_CREAT标志)
指定新创建文件的权限掩码(octal 值),例如:S_IRUSR(用户可读)S_IWUSR(用户可写)S_IXUSR(用户可执行)
一般组合方式为八进制,如
0664表示用户可读写,组用户和其他用户可读。
返回值
- 成功:返回一个非负的文件描述符,用于后续操作。关于文件描述符的作用,请见我的另一篇博文 https://blog.youkuaiyun.com/wenhao_ir/article/details/144918793
- 失败:返回
-1,并设置errno来指示错误原因。
常见用法示例
1. 打开文件进行只读操作
int fd = open("test.txt", O_RDONLY);
if (fd == -1) {
perror("Error opening file");
return -1;
}
2. 创建并打开文件
int fd = open("newfile.txt", O_WRONLY | O_CREAT, 0644);
if (fd == -1) {
perror("Error creating file");
return -1;
}
3. 打开设备文件
int fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NONBLOCK);
if (fd == -1) {
perror("Error opening device");
return -1;
}
嵌入式开发中的典型场景
-
访问设备文件
嵌入式系统中,许多硬件通过设备文件(如/dev)映射。通过open函数,可以访问这些设备以读取或写入数据。- 打开串口设备:
/dev/ttyS*。 - 操作 GPIO:通常通过
/sys/class/gpio。
- 打开串口设备:
-
文件系统管理
在嵌入式系统中操作文件(如配置文件、日志文件)也依赖open。 -
管道与通信
通过open操作命名管道(FIFO)或套接字文件,实现进程间通信。 -
特定文件系统访问
如 NFS、YAFFS 或 EXT 文件系统的文件访问。
注意事项
-
权限和安全性
使用O_CREAT创建文件时,需注意设置合理的mode掩码,以防止权限过宽。 -
文件描述符管理
每次成功调用open,系统分配一个文件描述符,使用完毕后需通过close释放资源。 -
非阻塞与同步
对设备文件使用非阻塞模式时,需结合poll或select处理读写操作。 -
错误处理
常见的错误包括:EACCES:无权限访问。ENOENT:文件不存在(未使用O_CREAT)。EEXIST:文件已存在但使用了O_EXCL。
通过正确使用 open 函数,可以灵活地管理文件和设备操作,满足嵌入式开发的多种需求。
756

被折叠的 条评论
为什么被折叠?



