Linux 错误处理
在 Linux C 编程中,很多系统调用和标准库函数都会通过返回值来表示是否出错。但是,返回值只能告诉你“出错了”,却无法告诉你为什么出错,这时候你就需要使用全局变量错误号 errno
和 perror()
函数来获取和打印错误信息,帮助快速定位错误原因。
本文将带你了解:
errno
是什么,怎么使用?perror
和strerror
的区别与用法;- 常见的错误码及其含义;
- 使用
errno
的注意事项; - 一个完整的错误处理示例。
什么是 errno?
errno
是一个全局变量,用于存储最近一次错误的错误代码(错误号)。当你调用某个函数失败时,比如 open()
、read()
、malloc()
等,它们通常会设置 errno
为一个具体的错误编号。
这个编号是一个整数,例如:
2
表示ENOENT
:文件不存在;13
表示EACCES
:权限不足;12
表示ENOMEM
:内存不足。
你可以在头文件中找到这些定义:
#include <errno.h>
⚠️ 注意:errno
不是一个普通变量,而是一个“线程局部”的宏,底层通过 TLS(线程局部存储)实现。它对多线程是安全的。
使用 perror 打印错误信息
你可以使用 perror()
来根据当前的 errno
值打印一条标准错误信息,非常方便调试:
#include <stdio.h>
perror("open"); // 输出类似 "open: No such file or directory"
这会输出你传入的字符串加上对应的错误信息,自动根据当前 errno
转换为人类可读的字符串。
使用 strerror 获取错误字符串
如果你想自己控制错误信息的格式,可以用 strerror()
:
#include <string.h>
printf("错误信息:%s\n", strerror(errno));
你也可以用它自定义日志输出:
fprintf(stderr, "打开文件失败(错误号 %d):%s\n", errno, strerror(errno));