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 进行相应的容错处理。

posted @ 2026-07-18 21:41  LoftyAmbition  阅读(4)  评论(0)    收藏  举报