errno 是记录系统的最后一次错误代码。代码是一个int型的值,在errno.h中定义。查看错误代码errno是调试程序的一个重要方法。当linux C api函数发生异常时,一般会将errno变量(需include errno.h)赋一个整数值,不同的值表示不同的含义,可以通过查看该值推测出错的原因。在实际编程中用这一招解决了不少原本看来莫名其妙的问题。
函数执行出错的原因有很多种,在C语言中定义了一个全局的整型变量errno来区分究竟发生了什么类型的错误;
在Linux系统中,可以使用man帮助查看errno的相关帮助文档
1、errno定义在errno.h文件中,该文件放在linux下的/usr/include/errno.h
注:值得注意的是,errno的错误值都不等于0,在C语言中0代表无错误
errno.h文件部分内容展示:
#define EPERM 1 /* Operation not permitted */
#define ENOENT 2 /* No such file or directory */
#define ESRCH 3 /* No such process */
#define EINTR 4 /* Interrupted system call */
#define EIO 5 /* I/O error */
#define ENXIO 6 /* No such device or address */
#define E2BIG 7 /* Argument list too long */
#define ENOEXEC 8 /* Exec format error */
#define EBADF 9 /* Bad file number */
#define ECHILD 10 /* No child processes */
#define EAGAIN 11 /* Try again */
#define ENOMEM 12 /* Out of memory */
#define EACCES 13 /* Permission denied */
#define EFAULT 14 /* Bad address */
#define ENOTBLK 15 /* Block device required */
#define EBUSY 16 /* Device or resource busy */
#define EEXIST 17 /* File exists */
#define EXDEV 18 /* Cross-device link */
#define ENODEV 19 /* No such device */
#define ENOTDIR 20 /* Not a directory */
#define EISDIR 21 /* Is a directory */
#define EINVAL 22 /* Invalid argument */
#define ENFILE 23 /* File table overflow */
#define EMFILE 24 /* Too many open files */
#define ENOTTY 25 /* Not a typewriter */
#define ETXTBSY 26 /* Text file busy */
#define EFBIG 27 /* File too large */
#define ENOSPC 28 /* No space left on device */
#define ESPIPE 29 /* Illegal seek */
#define EROFS 30 /* Read-only file system */
一、想得到errno的值,需引入头文件<errno.h>
#include <stdio.h>
#include <errno.h>
int main(void)
{
printf("errno = %d\n", errno);
if(fopen("any", "r") == NULL)
{
printf("errno = %d\n", errno);
}
return 0;
}
二、获得错误代码对应的错误信息
在C标准中定义了两个函数帮助打印输出errno的对应错误原因,一个是strerror,另一个是perror
1、strerror——包含在<string.h>头文件中
//函数原型
/*
*功能:将某个错误代码转换成对应的错误信息
*/
char *strerror(int errnuum);
函数的简单使用:
#include <stdio.h>
#include <string.h>
int main(void)
{
printf("errno5= %s\n", strerror(5));
return 0;
}
2、perror——包含在<stdio.h>头文件中
//函数原型
/*
*功能:根据error打印对应的错误信息
*参数:s: 用户自定义信息字符串,一般是出错的函数名
*/
void perror(const char *s);
函数的简单使用:
#include <stdio.h>
#include <errno.h>
int main(void)
{
printf("error = %d\n", errno);
if(fopen("any", "r") == NULL)
{
perror("fopen");
}
return 0;
}
提示:在编写程序时,要注意适当地设置函数的返回值来指明函数执行是否成功,并在返回值前给出恰当的提示。