好消息!!!网站已上线积分开通会员的功能啦!阅读站内文章不过瘾,试试“查找全网同类文章”功能,可以畅读全网的文章哦!
首页  >   经验  >   Linux查询错误码描述的功能实现

Linux查询错误码描述的功能实现

codexia 2018-12-14 10:52:35 397
错误码  
简介这是一个简单的查询工具,方便程序报错时返回错误码快速知道错误码代表的含义。程序写好后就放在服务器上,随时可以执行使用。

    这是一个简单的查询工具,方便程序报错时返回错误码快速知道错误码代表的含义。程序写好后就放在服务器上,随时可以执行使用。
    你可能要问,为什么不在代码里直接把错误描述输出来呢?当然可以啊。不过,有时候要输出错误信息,你存放到哪呢?要么打日志,要么就返回给上一级。通常我们是要返回上一级的,那么此时也只好将错误码返回给上一级。上一级如果需要的话,可以将错误描述打印出来。
    实际上,我们的错误描述通常不是给用户看的,而是给开发人员看的。既然如此,开发人员有错误码也就可以了。而额外增加的错误描述输出必然也造成了一个开销,因为是字符串存储的,有时候还可能因此引入bug,比如说内存越界等。
    所以我们直接返回错误码,开发人员只要查询一下错误码对应的错误描述就行了。
    在文章《FormatMessage格式化错误消息示例详解》中我讲解了Windows系统的错误码描述查询工具的代码实现,现在来讲一下Linux系统的错误码描述查询工具的代码实现。
    查询错误码描述的函数是:strerror
    此函数只有唯一一个int类型的参数,也就是错误码的值。这个函数的声明在string.h中。所以我们要包含string.h头文件。使用的方法也很简单,输入一个错误码参数,返回一个错误描述字符串。我们自己做一个交互,输入一个值,打印一个结果,这个程序就完成了。
    代码如下:

#include <string.h> 
#include <iostream>
using namespace std;
int main()
{
cout << "error code:";
int err_code;
cin >> err_code;
printf("%s\n", strerror(err_code));
return 0;
}

    其实看到前面的介绍,相信你就会写了。下面看看我们的效果图:


    其实呢,错误码的范围是有限的,而且根据不同的运行环境,错误码的描述还不一样。这一点我们需要清楚。我们这里所说的是系统默认的错误码描述。不过对于很多场景已经很有用了。那么对于这些预定义的错误描述,我们其实可以从两个头文件里看到。头文件的名称为errno.h和errno-base.h。
    errno-base.h里面定义的是基础的34个错误码的描述,而errno.h则定义了35到133错误码的错误描述。错误码0表示成功。如果错误码超出这个范围(0-133),请在相关的环境的错误描述文件里去找,这里是看不到的。我遇到一个错误码144,然后这里就查不到。另外,这两个文件的位置如果我们不清楚,也不想记,我们直接包含string.h就行了。否则去找这个asm-generic目录,一般在/usr/include/下面。
    errno-base.h内容如下:

#ifndef _ASM_GENERIC_ERRNO_BASE_H
#define _ASM_GENERIC_ERRNO_BASE_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 */
#define EMLINK 31 /* Too many links */
#define EPIPE 32 /* Broken pipe */
#define EDOM 33 /* Math argument out of domain of func */
#define ERANGE 34 /* Math result not representable */

#endif

errno.h内容如下:

#ifndef _ASM_GENERIC_ERRNO_H
#define _ASM_GENERIC_ERRNO_H

#include <asm-generic/errno-base.h>

#define EDEADLK 35 /* Resource deadlock would occur */
#define ENAMETOOLONG 36 /* File name too long */
#define ENOLCK 37 /* No record locks available */

/*
* This error code is special: arch syscall entry code will return
* -ENOSYS if users try to call a syscall that doesn't exist. To keep
* failures of syscalls that really do exist distinguishable from
* failures due to attempts to use a nonexistent syscall, syscall
* implementations should refrain from returning -ENOSYS.
*/
#define ENOSYS 38 /* Invalid system call number */

#define ENOTEMPTY 39 /* Directory not empty */
#define ELOOP 40 /* Too many symbolic links encountered */
#define EWOULDBLOCK EAGAIN /* Operation would block */
#define ENOMSG 42 /* No message of desired type */
#define EIDRM 43 /* Identifier removed */
#define ECHRNG 44 /* Channel number out of range */
#define EL2NSYNC 45 /* Level 2 not synchronized */
#define EL3HLT 46 /* Level 3 halted */
#define EL3RST 47 /* Level 3 reset */
#define ELNRNG 48 /* Link number out of range */
#define EUNATCH 49 /* Protocol driver not attached */
#define ENOCSI 50 /* No CSI structure available */
#define EL2HLT 51 /* Level 2 halted */
#define EBADE 52 /* Invalid exchange */
#define EBADR 53 /* Invalid request descriptor */
#define EXFULL 54 /* Exchange full */
#define ENOANO 55 /* No anode */
#define EBADRQC 56 /* Invalid request code */
#define EBADSLT 57 /* Invalid slot */

#define EDEADLOCK EDEADLK

#define EBFONT 59 /* Bad font file format */
#define ENOSTR 60 /* Device not a stream */
#define ENODATA 61 /* No data available */
#define ETIME 62 /* Timer expired */
#define ENOSR 63 /* Out of streams resources */
#define ENONET 64 /* Machine is not on the network */
#define ENOPKG 65 /* Package not installed */
#define EREMOTE 66 /* Object is remote */
#define ENOLINK 67 /* Link has been severed */
#define EADV 68 /* Advertise error */
#define ESRMNT 69 /* Srmount error */
#define ECOMM 70 /* Communication error on send */
#define EPROTO 71 /* Protocol error */
#define EMULTIHOP 72 /* Multihop attempted */
#define EDOTDOT 73 /* RFS specific error */
#define EBADMSG 74 /* Not a data message */
#define EOVERFLOW 75 /* Value too large for defined data type */
#define ENOTUNIQ 76 /* Name not unique on network */
#define EBADFD 77 /* File descriptor in bad state */
#define EREMCHG 78 /* Remote address changed */
#define ELIBACC 79 /* Can not access a needed shared library */
#define ELIBBAD 80 /* Accessing a corrupted shared library */
#define ELIBSCN 81 /* .lib section in a.out corrupted */
#define ELIBMAX 82 /* Attempting to link in too many shared libraries */
#define ELIBEXEC 83 /* Cannot exec a shared library directly */
#define EILSEQ 84 /* Illegal byte sequence */
#define ERESTART 85 /* Interrupted system call should be restarted */
#define ESTRPIPE 86 /* Streams pipe error */
#define EUSERS 87 /* Too many users */
#define ENOTSOCK 88 /* Socket operation on non-socket */
#define EDESTADDRREQ 89 /* Destination address required */
#define EMSGSIZE 90 /* Message too long */
#define EPROTOTYPE 91 /* Protocol wrong type for socket */
#define ENOPROTOOPT 92 /* Protocol not available */
#define EPROTONOSUPPORT 93 /* Protocol not supported */
#define ESOCKTNOSUPPORT 94 /* Socket type not supported */
#define EOPNOTSUPP 95 /* Operation not supported on transport endpoint */
#define EPFNOSUPPORT 96 /* Protocol family not supported */
#define EAFNOSUPPORT 97 /* Address family not supported by protocol */
#define EADDRINUSE 98 /* Address already in use */
#define EADDRNOTAVAIL 99 /* Cannot assign requested address */
#define ENETDOWN 100 /* Network is down */
#define ENETUNREACH 101 /* Network is unreachable */
#define ENETRESET 102 /* Network dropped connection because of reset */
#define ECONNABORTED 103 /* Software caused connection abort */
#define ECONNRESET 104 /* Connection reset by peer */
#define ENOBUFS 105 /* No buffer space available */
#define EISCONN 106 /* Transport endpoint is already connected */
#define ENOTCONN 107 /* Transport endpoint is not connected */
#define ESHUTDOWN 108 /* Cannot send after transport endpoint shutdown */
#define ETOOMANYREFS 109 /* Too many references: cannot splice */
#define ETIMEDOUT 110 /* Connection timed out */
#define ECONNREFUSED 111 /* Connection refused */
#define EHOSTDOWN 112 /* Host is down */
#define EHOSTUNREACH 113 /* No route to host */
#define EALREADY 114 /* Operation already in progress */
#define EINPROGRESS 115 /* Operation now in progress */
#define ESTALE 116 /* Stale file handle */
#define EUCLEAN 117 /* Structure needs cleaning */
#define ENOTNAM 118 /* Not a XENIX named type file */
#define ENAVAIL 119 /* No XENIX semaphores available */
#define EISNAM 120 /* Is a named type file */
#define EREMOTEIO 121 /* Remote I/O error */
#define EDQUOT 122 /* Quota exceeded */

#define ENOMEDIUM 123 /* No medium found */
#define EMEDIUMTYPE 124 /* Wrong medium type */
#define ECANCELED 125 /* Operation Canceled */
#define ENOKEY 126 /* Required key not available */
#define EKEYEXPIRED 127 /* Key has expired */
#define EKEYREVOKED 128 /* Key has been revoked */
#define EKEYREJECTED 129 /* Key was rejected by service */

/* for robust mutexes */
#define EOWNERDEAD 130 /* Owner died */
#define ENOTRECOVERABLE 131 /* State not recoverable */

#define ERFKILL 132 /* Operation not possible due to RF-kill */

#define EHWPOISON 133 /* Memory page has hardware error */

#endif

    但是如果经常需要查询,写成一个小程序存在服务器,随时可以查询,比较方便,代码也极其简单,不用记住错误码描述了。

文章标题:Linux查询错误码描述的功能实现
文章地址:http://www.cjjjs.com/article/20181212172509
转载到个人博客,请在文末带上右侧内容(含超链接):本文转载自:Linux查询错误码描述的功能实现
收藏 0 点赞 0

相关阅读

  1. Linux查询错误码描述的功能实现 查找全网同类文章
  2. 教你如何解决VS2015的30天试用期已过即VS2015许可证已过期的问题 查找全网同类文章
  3. Linux源码笔记——感觉写的巧妙的代码 查找全网同类文章
  4. 在Win7上安装VS2015 RC(候选发布版)失败完美解决方法 查找全网同类文章
  5. 完全图解VS2017安装过程并演示VS2017创建Linux项目和调试 查找全网同类文章
  6. VS2015入门必备介绍,扫扫盲吧 查找全网同类文章
  7. 表白代码,你值得拥有 查找全网同类文章
  8. 图解VS2017的MSDN的安装方法和过程 查找全网同类文章
  9. VS2015配置安卓Android和iOS开发环境 查找全网同类文章
  10. VS2015正式版安装选项详细说明,揭露VS2015的功能细节 查找全网同类文章
分享到:
分享文章[Linux查询错误码描述的功能实现]到QQ空间

相关阅读

猜您感兴趣