Wo sind die Errnos definiert? Beispiel Linux C/C ++ - Programm für i2c
Frage
Wenn in einer klassischen Linux C/C ++ -Software etwas schief geht, haben wir die magische Variable, die uns einen Hinweis darauf gibt, was gerade schief gelaufen ist.
Aber wo sind diese Fehler definiert?
Nehmen wir ein Beispiel (es ist tatsächlich ein Stück einer QT -App, daher der QDebug ()).
if (ioctl(file, I2C_SLAVE, address) < 0) {
int err = errno;
qDebug() << __FILE__ << __FUNCTION__ << __LINE__
<< "Can't set address:" << address
<< "Errno:" << err << strerror(err);
....
Der nächste Schritt besteht darin, sich zu untersuchen, was dieses Errno war, damit wir entscheiden können, ob wir nur kündigen oder versuchen, etwas gegen das Problem zu unternehmen.
Also fügen wir an diesem Punkt vielleicht ein If oder Wechseln hinzu.
if (err == 9)
{
// do something...
}
else
{
//do someting else
}
Und meine Frage ist, wo die Fehler, die "9" repräsentiert, zu finden? Ich mag diese Art von magischen Zahlen in meinem Code nicht.
/Vielen Dank
Lösung
Sie sind im Allgemeinen in definiert in /usr/include/errno.h
* und sind zugänglich, indem er errno.h einbezieht:
#include <errno.h>
Ich schreibe sowohl den Errno -Wert als auch seine Textbedeutung bei der Meldung eines Fehlers und erhalte die textuelle Bedeutung über strerror()
:
if (something_went_wrong)
{
log("Something went wrong: %s (%d)", strerror(errno), errno);
return false;
}
Aus einer Linux -Shell können Sie jedoch die verwenden perror
Nützlichkeit, um herauszufinden, was unterschiedliche Errno -Werte bedeuten:
$ perror 9
OS error code 9: Bad file descriptor
Bearbeiten: Ihr Code sollte geändert werden, um den symbolischen Wert zu verwenden:
if (err == EBADF)
{
// do something...
}
else
{
//do someting else
}
Bearbeiten 2: * Unter Linux werden zumindest die tatsächlichen Werte in definiert in /usr/include/asm-generic/{errno,errno-base}.h
und andere Orte, um es zu einem Schmerz zu machen, sie zu finden, wenn Sie sie ansehen möchten.
Andere Tipps
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 (i.e., -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.
Normalerweise müssen Sie zur Implementierung der Fehlerbehandlung wissen, welche bestimmten Fehlercodes von der Funktion zurückgegeben werden können. Diese Informationen sind in Man oder at erhältlich http://www.kernel.org/doc/man-pages/.
Zum Beispiel für IOCTL -Anruf sollten Sie die folgenden Codes erwarten:
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.
Bearbeiten: if <errno.h>
Ist auch alle Dateien enthalten, die alle möglichen Fehlercodes definieren, sodass Sie ihren genauen Standort nicht wirklich kennen müssen.
Die Datei lautet:
/usr/include/errno.h
--p