Wenn execl(...)
ich anrufe , bekomme ich eine errno=2
. Was heißt das? Wie kann ich die Bedeutung davon erkennen errno
?
221
Sie können verwenden strerror()
, um eine für Menschen lesbare Zeichenfolge für die Fehlernummer abzurufen. Dies ist dieselbe Zeichenfolge, die von gedruckt wird, perror()
aber es ist nützlich, wenn Sie die Fehlermeldung für etwas anderes als die Standardfehlerausgabe formatieren.
Beispielsweise:
#include <errno.h>
#include <string.h>
/* ... */
if(read(fd, buf, 1)==-1) {
printf("Oh dear, something went wrong with read()! %s\n", strerror(errno));
}
Linux unterstützt auch die explizit threadsichere Variante strerror_r()
.
strerror()
ist nicht threadsicher, währendstrerror_r()
threadsicher ist. MT-Safe- oder Thread-Safe-Funktionen können bei Vorhandensein anderer Threads sicher aufgerufen werden. MT steht in MT-Safe für Multi Thread. -p26, Die GNU C-Bibliothekchar * strerror(int errnum )
[Funktion] Vorläufig: | MT-Unsicheres Rennen: Fehler | AS-unsicherer Heap i18n | AC-Unsichere mem | Siehe Abschnitt 1.2.2.1 [POSIX-Sicherheitskonzepte], Seite 2. -p58, The GNU C Libraryerrno
ist also threadsicher. Schauen Sie:#define errno *__errno_location()
errno
, GNU libcstrerror
schreibt in den internen globalen Puffer . Dies ist nicht immer der Fall, in einigen Fällen jedoch. Sie werden diesen Puffer überschreiben, während ein anderer Thread ihn liest.errno
nichtstrerror()
.Anstatt mit
perror
einem Fehlercode zu arbeiten, den Sie erhalten, können Sie eine vollständige Liste dererrno
Werte auf Ihrem System mit dem folgenden Einzeiler abrufen :cpp -dM /usr/include/errno.h | grep 'define E' | sort -n -k 3
quelle
Unter Linux gibt es auch ein sehr übersichtliches Tool, das sofort erkennen kann, was jeder Fehlercode bedeutet. Unter Ubuntu :
apt-get install errno
.Wenn Sie beispielsweise die Beschreibung des Fehlertyps 2 erhalten möchten, geben Sie einfach
errno 2
das Terminal ein.Mit erhalten
errno -l
Sie eine Liste mit allen Fehlern und deren Beschreibungen. Viel einfacher als andere Methoden, die auf früheren Postern erwähnt wurden.quelle
perror
/strerror
besser, da der BENUTZER es dann nicht nachschlagen muss. Obwohlerrno -l
es besser ist, sie zu finden.Hier ist die Ausgabe von neu
errno -l
formatiert für die Lesbarkeit:Ich habe die Tabellierung in Vim verwendet, um die Spalten auszurichten:
quelle
Fehlercode 2 bedeutet "Datei / Verzeichnis nicht gefunden". Im Allgemeinen können Sie die Perror- Funktion verwenden, um eine lesbare Zeichenfolge zu drucken.
quelle
Es gibt einige nützliche Funktionen für den Umgang mit
errno
s. (Nur um es klar zu machen, diese sind integriert inlibc
- ich biete nur Beispielimplementierungen an, weil manche Leute das Lesen von Code klarer finden als das Lesen von Englisch.)strerror
Gibt eine Zeichenfolge zurück, die die Fehlernummer beschreibt, die Sie an sie übergeben haben. Achtung, dies ist nicht thread- oder Interrupt-sicher. Es ist frei, die Zeichenfolge neu zu schreiben und beim nächsten Aufruf denselben Zeiger zurückzugeben. Verwendenstrerror_r
Sie diese Option, wenn Sie sich darüber Sorgen machen müssen.perror
druckt die Nachricht aus, die Sie ihm geben, sowie eine Zeichenfolge, die den aktuellenerrno
Standardfehler beschreibt.quelle
some people find reading code clearer than reading English
Wahrheit.Dies ist schneller als das Nachschlagen des Codes
errno.h
, kürzer als die meisten hier veröffentlichten Lösungen und erfordert keine Installation von Tools von Drittanbietern:perl -E 'say $!=shift' 2
ergibt
No such file or directory
quelle
-E
behandelt den folgenden zitierten Code als Perl-Skript.say
schreibt seine Argumente in die Standardausgabe.$!
ist eine spezielle Variable, die den Wert von enthälterrno
. Bei Verwendung im Zeichenfolgenkontext wird die entsprechende Fehlerzeichenfolge ausgegeben. Das Skript weist2
dieser Variablen den Wert zu, indem es denshift
Befehl verwendet, der den Kopf des Argumentarrays abschneidet@ARGV
und diesen Kopf an seine Stelle setzt. Die Befehlszeile könnte auch als geschrieben worden seinperl -E 'say $!=2'
.Funktioniert unter Solaris.
cc perror.c -o perror
<< Verwenden Sie diese Zeile, um sie zu kompilierenquelle
perror(NULL);
? Mitperror("");
seinem Format ist: ERROR NAME
. Mitperror(NULL);
seiner Ausgabe ist nurERROR NAME
Hier ist die Dokumentation . Das sollte dir sagen, was es bedeutet und was du mit ihnen machen sollst. Sie sollten die Verwendung des numerischen Werts vermeiden und auch die dort aufgeführten Konstanten verwenden, da sich die Anzahl zwischen verschiedenen Systemen ändern kann.
quelle
errnoname
Bibliothek interessieren . Es kümmert sich um den mühsamen Teil des Sammelns aller möglichen Errno-Namen in einer C-Funktion, die nur trivial verwendet werden kann, um den Errno-Makronamen aus der Nummer zu erhalten. Auf dieser Grundlage sollte die Erstellung Ihrerperror
Variante schnell und einfach sein.Ich benutze das folgende Skript:
quelle
Geben Sie ein
sudo apt-get install moreutils
und geben Sie nach der Installation einerrno 2
. Sie können aucherrno -l
für alle Fehlernummern verwenden oder nur die Dateien anzeigen, indem Sie siegrep
wie folgt weiterleiten :errno | grep file
.quelle
Anruf
im Fehlerfall.
Stichprobe:
Die Manpages von
errno(3)
undperror(3)
sind auch interessant ...quelle
Wenn Sie strace (unter Linux) verwenden, um Ihre Binärdatei auszuführen, werden die Rückgaben von Systemaufrufen und die Bedeutung der Fehlernummer ausgegeben. Dies kann manchmal nützlich für Sie sein.
quelle
Ich habe die folgende Funktion in meinem .bashrc - es sieht den errno - Wert aus den Header - Dateien auf (kann entweder
/usr/include/errno.h
,/usr/include/linux/errno.h
etc., etc.)Es funktioniert, wenn Header-Dateien auf dem Computer installiert sind ;-)
Normalerweise hat die Header-Datei einen Fehler + als nächstes kommt die Erklärung im Kommentar; etwas von folgendem:
./asm-generic/errno-base.h:#define EAGAIN 11 / * Versuchen Sie es erneut * /
quelle
Es bedeutet:
quelle