web-dev-qa-db-fra.com

Quand devrais-je utiliser perror ("...") et fprintf (stderr, "...")?

La lecture des pages de manuel et de certains codes ne m'a pas vraiment aidée à comprendre la différence entre - ou mieux, quand je devrais utiliser - perror("...") ou fprintf(stderr, "...").

96
freeboy1015

L'appel de perror vous donnera la valeur interprétée de errno, qui est une valeur d'erreur locale au thread écrite par les appels système POSIX (c'est-à-dire que chaque thread a sa propre valeur pour errno ) Par exemple, si vous appelez open(), et qu'une erreur soit générée (c'est-à-dire qu'elle renvoie -1), Vous pouvez appeler perror immédiatement après pour voir quelle était l'erreur réelle. N'oubliez pas que si vous appelez d'autres appels système dans l'intervalle, la valeur dans errno sera écrasée et l'appel de perror ne sera d'aucune utilité pour diagnostiquer votre problème en cas d'erreur. a été généré par un appel système précédent.

fprintf(stderr, ...) peut être utilisé pour imprimer vos propres messages d'erreur personnalisés. En imprimant sur stderr, vous évitez que votre sortie de rapport d’erreurs soit mélangée à une sortie "normale" qui devrait aller à stdout.

Gardez à l’esprit que fprintf(stderr, "%s\n", strerror(errno)) est similaire à perror(NULL) puisqu'un appel à strerror(errno) générera la valeur de chaîne imprimée pour errno, et vous pourrez alors combiné à tout autre message d'erreur personnalisé via fprintf.

102
Jason

Ils font des choses assez différentes.

Vous utilisez perror() pour imprimer un message à stderr qui correspond à errno. Vous utilisez fprintf() pour imprimer n'importe quoi sur stderr ou tout autre flux. perror() est une fonction d'impression très spécialisée:

perror(str);

est équivalent à

if (str)
    fprintf(stderr, "%s: %s\n", str, strerror(errno));
else
    fprintf(stderr, "%s\n", strerror(errno));
38
freeboy1015

perror(const char *s): affiche la chaîne que vous lui avez donnée, suivie d'une chaîne décrivant la valeur actuelle de errno.

stderr: c'est un flux de sortie utilisé pour diriger vos propres messages d'erreur (par défaut au terminal).

Pertinent:

char *strerror(int errnum): donnez-lui un numéro d'erreur, et la chaîne d'erreur associée sera renvoyée.

10
Adib

perror () écrit toujours dans stderr; strerr (), utilisé avec fprintf (), peut écrire sur n’importe quelle sortie - y compris stderr mais pas exclusivement.

fprintf(stdout, "Error: %s", strerror(errno));
fprintf(stderr, "Error: %s", strerror(errno)); // which is equivalent to perror("Error")

En outre, perror impose son propre texte formating "text: description de l'erreur"

1
Sebastien