errnos在哪里定义? 例如,用于i2c的linux c / c ++程序

当一个经典的linux c / c ++软件出现问题时,我们有了一个魔术variableserrno,它给我们提供了错误的线索。

但是这些错误在哪里定义?

我们来举个例子(它实际上是一个Qt应用程序的一部分,因此qDebug())。

if (ioctl(file, I2C_SLAVE, address) < 0) { int err = errno; qDebug() << __FILE__ << __FUNCTION__ << __LINE__ << "Can't set address:" << address << "Errno:" << err << strerror(err); .... 

下一步是看看errno是什么,所以我们可以决定是否退出或试图解决这个问题。

所以我们可能在这个时候添加一个if或者switch。

 if (err == 9) { // do something... } else { //do someting else } 

而我的问题是在哪里find“9”代表的错误? 我不喜欢我的代码中那种神奇的数字。

/谢谢

它们通常在/usr/include/errno.h *中定义,并可通过包含errno.h来访问:

 #include <errno.h> 

在报告错误时,我写出了errno值及其文本含义,通过strerror()获取文本含义:

 if (something_went_wrong) { log("Something went wrong: %s (%d)", strerror(errno), errno); return false; } 

但是,从Linux shell中,可以使用perror实用程序来查找不同的errno值的含义:

 $ perror 9 OS error code 9: Bad file descriptor 

编辑:您的代码应该更改为使用符号值:

 if (err == EBADF) { // do something... } else { //do someting else } 

编辑2:*在Linux下,至少,实际值是在/usr/include/asm-generic/{errno,errno-base}.h和其他地方定义的,如果你找到它们会有点痛苦想看看他们。

 NAME errno - number of last error SYNOPSIS #include <errno.h> DESCRIPTION The <errno.h> header file defines the integer variable errno, which is set by system calls and some library functions in the event of an error to indicate what went wrong. Its value is significant only when the return value of the call indicated an error (ie, -1 from most system calls; -1 or NULL from most library functions); a function that succeeds is allowed to change errno. Valid error numbers are all non-zero; errno is never set to zero by any system call or library function. 

通常为了实现错误处理,您需要知道函数可以返回哪些特定的错误代码。 这个信息可以在man或http://www.kernel.org/doc/man-pages/找&#x5230; 。

例如,对于ioctl调用,您应该期望以下代码:

  EBADF d is not a valid descriptor. EFAULT argp references an inaccessible memory area. EINVAL Request or argp is not valid. ENOTTY d is not associated with a character special device. ENOTTY The specified request does not apply to the kind of object that the descriptor d references. 

编辑:如果包含<errno.h>所有包含所有可能的错误代码的文件都包含在内,那么你并不需要知道它们的确切位置。

该文件是:

/usr/include/errno.h的

–P