天天看点

c语言——出错处理errno 3. 多线程扩展

#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() 就会重新设置静态缓冲区的内容。

继续阅读