C语言中errno错误码定义及使用
一.概述
1.介绍
在 C 语言中,errno是一个用于标识程序运行时错误的全局变量。当系统调用或库函数执行失败时,通常会设置errno以指示具体的错误类型。
2.errno的基本定义
头文件:#include <errno.h>
类型:int
用途:存储最近一次系统调用或库函数失败的错误码
3.常见错误码及其含义
以下是 POSIX 标准定义的部分常见错误码(完整列表可通过man errno查看):
二.errno使用
1.检查函数返回值
大多数库函数在失败时会返回特殊值(如NULL、-1),并设置errno:
#include <stdio.h>
#include <errno.h>
#include <string.h>
int main() {
FILE* file = fopen("nonexistent.txt", "r");
if (file == NULL) {
// 检查errno并处理错误
if (errno == ENOENT) {
printf("文件不存在\n");
} else if (errno == EACCES) {
printf("权限不足\n");
} else {
printf("未知错误: %d\n", errno);
}
}
return 0;
}
2.使用错误处理函数
C 标准库提供了两个常用函数来处理errno:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
int main() {
// 1. perror(): 打印自定义消息+系统错误信息
FILE* file = fopen("nonexistent.txt", "r");
if (file == NULL) {
perror("打开文件失败");
// 输出示例: "打开文件失败: No such file or directory"
}
// 2. strerror(): 返回错误码对应的字符串描述
int error_code = errno;
printf("error_code=%d; 错误描述: %s\n", error_code,strerror(error_code));
// 输出示例: "错误描述: No such file or directory"
return 0;
}
3.自定义错误处理函数
可以封装错误处理逻辑,提高代码可读性:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
// 自定义错误处理函数
void handle_error(const char* msg) {
fprintf(stderr, "%s: %s\n", msg, strerror(errno));
exit(EXIT_FAILURE);
}
int main() {
FILE* file = fopen("nonexistent.txt", "r");
if (file == NULL) {
handle_error("无法打开文件"); // 输出: "无法打开文件: No such file or directory"
}
return 0;
}
4.线程安全
(1)在多线程环境中,errno通常是线程局部的(每个线程有自己的errno副本),避免线程间干扰。
(2)及时检查
原因:成功的函数调用可能会重置errno,因此必须在函数失败后立即检查。
示例:
int value = atoi("not_a_number");
if (value == 0) {
// 错误!无法判断是输入"0"还是转换失败
if (errno == EINVAL) {
// 这里的检查可能无效,因为atoi成功时可能重置errno
}
}
(3)重置errno
在关键调用前手动将errno置零,确保错误码来自当前操作:
errno = 0;
int fd = open("file.txt", O_RDONLY);
if (fd == -1) {
// 此时errno一定来自open()
perror("打开文件失败");
}
三.总结
1.errno是 C 语言中处理系统错误的核心机制,使用时需注意:
先检查函数返回值,再判断errno;
及时处理错误,避免被后续操作覆盖;
结合perror()或strerror()提高错误信息可读性;
多线程环境中无需担心线程间干扰。