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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值