Das Lesen der man-Seiten und etwas Code hat mir nicht wirklich geholfen in Verständnis der Unterschied zwischen - oder besser, wenn ich verwenden sollte - perror("...")
oder .Wann sollte ich perror ("...") und fprintf (stderr, "...") verwenden?
Antwort
perror
Aufruf wird Ihnen das interpretiert Wert von errno
, die ein Thread-Lokal von POSIX syscalls geschrieben Fehlerwert ist (das heißt, jeder Thread hat seinen eigenen Wert ist für errno
). Zum Beispiel, wenn Sie einen Anruf an open()
, und es wurde ein Fehler generiert (d. H., Es zurückgegeben -1
), können Sie dann sofort perror
aufrufen, um zu sehen, was der eigentliche Fehler war. Denken Sie daran, dass der Wert in errno
überschrieben wird, wenn Sie in der Zwischenzeit andere syscalls aufrufen, und das Aufrufen von perror
wird bei der Diagnose Ihres Problems nicht von Nutzen sein, wenn ein Fehler von einem früheren syscall generiert wurde.
fprintf(stderr, ...)
auf der anderen Seite kann verwendet werden, um Ihre eigenen benutzerdefinierten Fehlermeldungen zu drucken. Wenn Sie auf stderr
drucken, vermeiden Sie, dass Ihre Fehlermeldungsausgabe mit der "normalen" Ausgabe gemischt wird, die auf stdout
gehen sollte.
Beachten Sie, dass fprintf(stderr, "%s\n", strerror(errno))
-perror(NULL)
ähnlich ist die gedruckte String-Wert für errno
da ein Aufruf an strerror(errno)
generiert, und Sie können kombiniert dann, dass mit jeder anderen Nachricht individuelle Fehler über fprintf
.
perror(const char *s)
: Gibt die von Ihnen angegebene Zeichenfolge aus, gefolgt von einer Zeichenfolge, die den aktuellen Wert errno
beschreibt.
stderr
: Es ist ein Ausgabestrom, der verwendet wird, um eigene Fehlermeldungen an (standardmäßig das Terminal) zu leiten.
Relevant:
char *strerror(int errnum)
: geben sie eine Fehlernummer, und es wird die zugehörige Fehlerzeichenfolge zurück.
Sie tun ziemlich verschiedene Dinge.
Sie verwenden perror()
, um eine Nachricht an stderr
zu drucken, die errno
entspricht. Sie verwenden fprintf()
, um alles bis stderr
oder einen anderen Stream zu drucken. perror()
ist eine sehr spezielle Druckfunktion:
perror(str);
entspricht
if (str)
fprintf(stderr, "%s: %s\n", str, strerror(errno));
else
fprintf(stderr, "%s\n", strerror(errno));
Perror Funktion mehr Zeit in Anspruch nehmen Ausführung Anruf von User-Space geht an kernal Raum auszuführen wheras fprintf Anrufe hingehst api
Kernalperror() schreibt immer in stderr; Strerr(), zusammen mit fprintf() verwendet, kann auf jeden Ausgang schreiben - einschließlich stderr, aber nicht ausschließlich.
fprintf(stdout, "Error: %s", strerror(errno));
fprintf(stderr, "Error: %s", strerror(errno)); // which is equivalent to perror("Error")
Außerdem perror seine eigene Text Formatierung erlegt "Text: Fehlerbeschreibung"
oh, bekamen it.The perror Funktion auf dem Wert je funktioniert anders von errno.'Wenn Sie eine Funktion verwenden, die errno bewirkt, dann ist es sinnvoll, perror zu verwenden. Wenn Sie eine Funktion verwenden, die keinen errno bewirkt und einfach einen Fehlercode zurückgibt, sollten Sie fprintf (stderr, fmt, ...) verwenden. Zum Beispiel, strtol wird LONG_MAX oder LONG_MIN zurückgeben, wenn eine Zeichenfolge außerhalb des Bereichs ist, und errno auf ERANGE setzen. Wenn also strtol aufgrund von außerhalb des Bereichs versagt, würde ich perror verwenden. – freeboy1015
Ein Detail, 'stredror' ist nicht unbedingt threadsicher. Es ist dumm, aber das ist der Standard. 'strerror_l' kann stattdessen als Ersatz für POSIX 2008-Systeme verwendet werden. 'strerror_r' ist auch auf älteren Systemen verfügbar, hat aber sehr unangenehme Probleme mit einigen Systemen, die nicht-konforme Versionen haben. –
auch als Nitpick, ich denke, 'perror' fügt '' \ n'' am Ende, so dass das Format würde "% s \ n" ', nein? –