龙空技术网

Linux下一个非常有用的错误码和错误信息打印方法

haifeng695 180

前言:

眼前看官们对“nginx no such process”都比较着重,看官们都需要知道一些“nginx no such process”的相关内容。那么小编同时在网摘上搜集了一些关于“nginx no such process””的相关文章,希望大家能喜欢,看官们一起来学习一下吧!

在调试程序的过程中,我们经常会碰到一个系统函数返回了错误值,但对于这个错误产生的原因却并不清楚。即使通过GDB去调查,因为无法进入这个库函数内部,我们还是没办法知道具体原因。除了上网去搜各种大神的帖子,有没有一种简单的办法呢?

Linux提供了一个errno方法,让我们可以在一个函数执行结束后通过变量errno打印出错值,再进一步通过Linux提供的函数把错误代码翻译成为可读的错误描述(按照errno.h里的定义)。这个方法虽然简单,却非常有用,所以这里单独开一篇短文来介绍。

首先需要include的库文件

#include <errno.h>

#include <string.h>

#include <stdio.h>

errno.h 头文件定义了错误码和描述之间的关系

string.h 提供了把错误码转换为错误描述的方法char *strerror(int errnum);

示例代码段:

kevin_shm_id = shmget(kevin_shm_key,shm_size,PARAM);

if(-1 == kevin_shm_id)

{

printf("get shm id failed\n");

printf("errno is: %d, %s\n",errno, strerror(errno));

}

如果shmget函数返回了-1,我们就会知道获取共享内存失败了。但为什么获取内存会失败呢?

这时候我们调用上面讲述的errno的方法,在获取共享内存失败时,紧接着把错误码通过变量errno打印出来,再通过strerror函数把errno转换成语言描述。

比如我们给shmget函数传入无效的输入参数值,这个时候上述代码段仍然可以编译通过,可以正常运行,但shmget返回了-1值,进入了出错处理分支,如下图所示:

如果不调用errno方法,我只能知道get共享内存失败了,但为什么失败不清楚。

通过errno方法,我们可以打印出shmget系统函数返回-1的原因是“errno=22”,通过strerror的翻译,我们进一步知道 errno=22,意味着“无效的参数(Invalid arguement)”。

怎么样,虽然就一行代码,但却对我们查找问题的根本原因,提供了更加直观的描述,很赞吧?

好了,希望这篇小短文能对大家日常编程和代码调试提供一点帮助和启发。

附件: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 */#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 */#define EDEADLK 35 /* Resource deadlock would occur */#define ENAMETOOLONG 36 /* File name too long */#define ENOLCK 37 /* No record locks available */#define ENOSYS 38 /* Function not implemented */#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 NFS 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 */

标签: #nginx no such process