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