自学内容网 自学内容网

C语言——错误处理机制errno

前言

在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()),可以有效地进行错误处理和调试。合理的错误处理机制能够提高程序的健壮性和用户的体验。


原文地址:https://blog.csdn.net/weixin_56362288/article/details/142291665

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!