在Linux中,errno
是一个非常重要的全局变量,用于存储系统调用的错误代码。
以下是关于errno
的详细解释:
定义和用途:
1.errno
是一个预定义的外部整型(int)变量,通常包含在<errno.h>
头文件中。
2.当系统调用或库函数发生错误时,它们通常会设置errno
以指示发生了哪种错误。
3.errno
的值仅在函数失败时才会被设置,并且会覆盖之前的值。
4.通过检查errno
的值,程序员可以确定发生了什么错误,并据此编写适当的错误处理代码。
在 /usr/include/asm-generic/errno-base.h 中记录着errno对应的错误信息
4#define EPERM 1 /* Operation not permitted */ 5 #define ENOENT 2 /* No such file or directory */ 6 #define ESRCH 3 /* No such process */ 7 #define EINTR 4 /* Interrupted system call */ 8 #define EIO 5 /* I/O error */ 9 #define ENXIO 6 /* No such device or address */ 10 #define E2BIG 7 /* Argument list too long */ 11 #define ENOEXEC 8 /* Exec format error */ 12 #define EBADF 9 /* Bad file number */ 13 #define ECHILD 10 /* No child processes */ 14 #define EAGAIN 11 /* Try again */ 15 #define ENOMEM 12 /* Out of memory */ 16 #define EACCES 13 /* Permission denied */ 17 #define EFAULT 14 /* Bad address */ 18 #define ENOTBLK 15 /* Block device required */ 19 #define EBUSY 16 /* Device or resource busy */ 20 #define EEXIST 17 /* File exists */ 21 #define EXDEV 18 /* Cross-device link */ 22 #define ENODEV 19 /* No such device */ 23 #define ENOTDIR 20 /* Not a directory */ 24 #define EISDIR 21 /* Is a directory */ 25 #define EINVAL 22 /* Invalid argument */ 26 #define ENFILE 23 /* File table overflow */ 27 #define EMFILE 24 /* Too many open files */ 28 #define ENOTTY 25 /* Not a typewriter */ 29 #define ETXTBSY 26 /* Text file busy */ 30 #define EFBIG 27 /* File too large */ 31 #define ENOSPC 28 /* No space left on device */ 32 #define ESPIPE 29 /* Illegal seek */
使用示例:
- 在C程序中,如果某个系统调用或库函数调用失败,并且你想检查失败的原因,你应该在调用后立即检查
errno
的值。 - 需要注意的是,由于
errno
的值可能会被后续的系统调用或库函数调用覆盖,所以你应该在函数失败后立即检查它的值。
1 #include<stdio.h> 2 #include <errno.h> 3 int main() 4 { 5 FILE*fp; 6 fp = fopen("temp","r"); 7 if(fp == NULL) 8 { 9 fprintf(stderr,"fopen() failed! errno = %d\n",errno); 10 exit(1); 11 } 12 puts("OK!"); 13 exit(0); 14 }
示例中我们试图以只读方式打开一个不存在的文件。
运行结果:
fopen() failed! errno = 2
可以看到errno = 2,对应上面的为
#define ENOENT 2 /* No such file or directory */
直接使用errno存在一个缺陷,因为errno是一个整型数值,需要查找才能确定错误信息,我们可做如下改进:使用perror()
示例如下:
1 #include<stdio.h> 2 #include <errno.h> 3 int main() 4 { 5 FILE*fp; 6 fp = fopen("temp","r"); 7 if(fp == NULL) 8 { 9 //fprintf(stderr,"fopen() failed! errno = %d\n",errno); 10 perror("fopen() failed!"); 11 exit(1); 12 } 13 puts("OK!"); 14 exit(0); 15 }
这样可以直接输出错误信息,输出结果如下:
fopen() failed!: No such file or directory
或者使用strerror
示例如下:
1 #include<stdio.h> 2 #include <errno.h> 3 #include <string.h> 4 5 int main() 6 { 7 FILE*fp; 8 fp = fopen("temp","r"); 9 if(fp == NULL) 10 { 11 //fprintf(stderr,"fopen() failed! errno = %d\n",errno); 12 //perror("fopen() failed!"); 13 fprintf(stderr,"fopen() failed! errno = %s\n",strerror(errno)); 14 exit(1); 15 } 16 puts("OK!"); 17 exit(0); 18 }
运行结果:
fopen() failed! errno = No such file or directory
标签:fp,perror,No,errno,strerror,failed,fopen,define From: https://www.cnblogs.com/sunyiping/p/18278436