c语言——出错处理errno

本文详细介绍了C/C++编程语言中的errno变量及其使用方法。包括errno的基本概念、如何通过errno判断错误类型,以及如何利用strerror和perror函数将错误码转换为易读的字符串形式。此外还探讨了errno在多线程环境下的应用。
摘要由CSDN通过智能技术生成

 

#include <stdio.h>
void perror(const char *msg);


1. errno变量

      文件 <errno.h> 中定义了符号 errno 以及可以赋予它的各种常量,这些常量都是以字符 E 开头。例如,若 errno 等于常量 EACCES,表示产生了权限问题(例如,没有打开所要求文件的足够权限)。

errno特点:

1、当出错的时候,errno会自动被赋值。一个int数据

2、errno默认为0,表示没有错误,当出错时,errno被赋值(大于0),然后保持改值,直到下一次出错,被修改为下一次错误的值。

 

errno直接打印是一个数字,查看不方便,可用函数转换为字符串。

函数1

 

#include <string.h>
char *strerror(int errnum);

 

此函数将 errno映射为一个出错信息字符串,并且返回此字符串的指针。

 

 

 

函数2

 

#include <stdio.h>
void perror(const char *msg);

它首先输出由 msg 指向的字符串,然后是一个冒号,一个空格,接着是对应于 errno 值的出错信息,最后是一个换行符。

 

 

 

 

 

2. errno_demo

 

int main(int argc,char* argv[])
{
    int fd;
    
    if ((fd = open("foo.txt", O_RDONLY)) == -1) 
    {
        printf("errno is %d \n", errno);
        printf("error: %s \n", strerror(errno));
        perror("open file:"); 
    } else {
        printf("open success \n");
    }
    
    return 0;
}


输出结果:

 

errno is 2 
error: No such file or directory 
open file:: No such file or directory

源代码地址:  errno demo程序github

 

3. 多线程扩展

 

在支持线程的环境中,多个线程共享进程地址空间,每个线程都有属于它自己的局部 errno 以避免一个线程干扰另一个线程。

函数 strerror() 不是线程安全的。因为该函数将 errnum 对应的字符串保存在一个静态的缓冲区中,然后将该缓冲区的指针返回。另一个线程调用 strerror() 就会重新设置静态缓冲区的内容。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值