首页 > 其他分享 >一、errno perror strerror的使用

一、errno perror strerror的使用

时间:2024-07-01 17:12:12浏览次数:12  
标签:fp perror No errno strerror failed fopen define

在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

相关文章