Linux open() 函数与 errno 学习笔记
一、核心概念辨析
在 Linux open()系统调用中,返回值与 errno 有着严格的分工:
返回值(Return Value):仅作为成功与否的“指示器”。成功时返回非负整数(文件描述符),失败时统一返回 -1。
errno:是一个全局变量(通常由 <errno.h> 中的宏定义),作为“错误状态码载体”。当系统调用失败时,它会被赋值为具体的错误代码(如 EACCES、ENOENT 等整数常量)。
打印信息:errno 本身只是一个数字,并非字符串。需要通过 perror() 或 strerror(errno) 等辅助函数,将其翻译成人类可读的提示信息。
二、errno 的核心使用原则
成功不重置:系统调用在成功时,不会将 errno 重置为 0。
先判返回值,再看 errno:永远不要单独检查 errno 的值来判断是否出错。必须严格遵循以下范式:
int fd = open("test.txt", O_RDONLY);
if (-1 == fd) {
// 1. 确认返回值指示了错误
// 2. 此时读取 errno 才有意义
perror("open failed");
} else {
// 文件打开成功,不要关心 errno 之前的残留值
printf("File opened successfully, fd = %dn", fd);
}
三、常见 errno 错误码速查
| 错误码 | 含义 | 常见触发场景 |
|---|---|---|
ENOENT |
文件或目录不存在 | 路径拼写错误,或目标文件未创建 |
EACCES |
权限不足 | 尝试以写模式打开只读文件,或缺乏目录执行权限 |
EEXIST |
文件已存在 | 同时使用 O_CREAT | O_EXCL 且目标文件已存在 |
EISDIR |
指定路径是目录 | 尝试以写模式打开一个目录 |
EMFILE |
进程文件描述符耗尽 | 进程打开的文件数达到系统限制 |
ENFILE |
系统文件描述符耗尽 | 整个系统的文件描述符资源被耗尽 |
四、关键注意事项
头文件引入:使用 errno 时必须包含 <errno.h>,使用 open() 需包含 <fcntl.h>。
线程安全性:在现代 Linux 系统中,errno 是线程安全的(通过宏映射到线程局部存储)。
错误处理闭环:调用 open() 后,务必检查返回值。若发生错误,应通过 perror() 打印日志或根据 errno 进行相应的容错处理。

浙公网安备 33010602011771号