前言
在C语言中,错误处理主要是通过全局变量 errno 和相关的错误处理函数来实现的。errno 是一个全局整型变量,用于存储最近发生的系统调用或库函数调用失败的原因。当一个系统调用或库函数调用失败时,通常会设置 errno 的值,并返回一个指示错误的值。
一、errno 变量作用
1. 系统调用失败:当系统调用(如 open(), read(), write(), fork(), exec(), wait() 等)失败时,会设置 errno。
2. 库函数调用失败:当标准库函数(如 fopen(), fread(), fwrite(), strtok(), malloc(), realloc(), free() 等)失败时,也会设置 errno
errno 的值errno 的值是一个整数,表示不同的错误原因。常见的 errno 错误码及其含义如下:
详细见收藏errno文章。
二、获取和设置 errno 的值
1.直接显示errno值
代码示例:
#include <stdio.h>
#include <errno.h>
#include <unistd.h>
#include <string.h>
int main()
{
int result = close(5);//假设5不是一个有效的文件描述符
if(result == -1)
{
int err = errno;
printf("Close failed with error code:%d\n",err);
}
return 0;
}
运行结果:输出结果9对应错误代码的含义
2.perror():打印错误消息,并附加 errno 的解释。
代码示例:
#include <stdio.h>
#include <string.h>
#include <error.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
int main()
{
int fd = open("example.txt",O_RDONLY);
if(fd == -1){
perror("Error opening file");//打印错误消息,并附加errno的解释
return -1;
}
char buffer[256];
ssize_t bytesRead = read(fd,buffer,sizeof(buffer)-1);
if(bytesRead == -1)
{
perror("Error reading from file");//打印错误消息,并附加errno的解释
close(fd);
return 1;
}
buffer[bytesRead] = '\0';
printf("Content of the file:%s\n",buffer);
close(fd);//关闭文件描述符
return 0;
}
运行结果:如果没有example.txt文本文件,会报如下错误
3.strerror():将 errno 的值转换为字符串描述。
代码示例:
#include <stdio.h>
#include <errno.h>
#include <unistd.h>
#include <string.h>
int main()
{
int result = close(5);//假设5不是一个有效的文件描述符
if(result == -1){
printf("Close failed with error:%s\n",strerror(errno));
}
return 0;
}
运行结果:
errno:全局变量,可以直接读取或设置。
总结
在 C 语言中,errno 是一个全局变量,用于存储最近发生的错误的编号。通过检查 errno 的值以及使用相关的错误处理函数(如 perror(), strerror()),可以有效地进行错误处理和调试。合理的错误处理机制能够提高程序的健壮性和用户的体验。