La vérification des erreurs fprintf lors de l'impression sur stderr
Selon les docs, fprintf peut échouer et retourne un nombre négatif en cas d'échec. Il y a clairement beaucoup de situations où il serait utile de vérifier cette valeur.
Cependant, j'ai l'habitude d'utiliser fprintf pour imprimer les messages d'erreur vers stderr. Mon code sera généralement chercher quelque chose comme ceci:
rc = foo();
if(rc) {
fprintf(stderr, "An error occured\n");
//Sometimes stuff will need to be cleaned up here
return 1;
}
Dans ces cas, est-il encore possible pour fprintf à l'échec? Si oui, est-il quelque chose qui peut être fait pour afficher le message d'erreur en quelque sorte, ou est-il est une alternative plus sûre à fprintf?
Si non, est-il besoin de vérifier fprintf lorsqu'il est utilisé de cette façon?
OriginalL'auteur Rupert Madden-Abbott | 2011-01-31
Vous devez vous connecter pour publier un commentaire.
Le C standard dit que le fichier flux stdin, stdout, et stderr doit être connecté quelque part, mais elles ne précisent pas où, bien sûr. Il est parfaitement possible d'exécuter un programme avec eux redirigé:
Votre écrit réussira - mais l'information ne sera pas aller n'importe où. Une plus brutale de l'exécution de votre programme est:
Cette fois, il a été exécuté sans ouvrir le flux de fichiers pour stdout et stderr - en contravention de la norme. C'est encore la lecture à partir de /dev/null dans l'exemple, ce qui signifie qu'il ne soit pas utile de données d'entrée à partir de stdin.
De nombreux un programme n'a pas pris la peine de vérifier que la norme canaux d'e/S sont ouverts. De nombreuses un programme n'a pas pris la peine de vérifier que le message d'erreur a été écrit avec succès. L'élaboration d'un convenable de secours, tel que demandé par Tim Post et whitey04 n'est pas toujours utile de l'effort. Si vous exécutez le
ls
de commande avec ses sorties supprimé, il va tout simplement faire ce qu'il peut et se termine avec un état différent de zéro:(Testé RHEL Linux.) Il n'y a vraiment pas besoin d'en faire plus. D'autre part, si votre programme est censé fonctionner en arrière-plan et écrire dans un fichier journal, il ne sera probablement pas écrire beaucoup sur la sortie stderr, à moins qu'il ne parvient pas à ouvrir le fichier journal (ou de taches à une erreur dans le fichier journal).
Noter que si vous tomber en arrière sur
syslog(3)
(ou POSIX), vous n'avez aucun moyen de savoir si vos appels ont été "réussie" ou pas; le syslog toutes les fonctions de retour d'état n'est pas de l'information. Vous avez juste à supposer qu'ils ont été couronnées de succès. C'est votre dernier recours, donc.merci, mais votre réponse fournit de bonnes informations trop - et vous y êtes arrivé en premier. Et votre point clé - utiliser une fonction qui fait l'erreur de déclaration, pas un paragraphe de code à chaque fois que vous devez signaler une erreur - est très important.
OriginalL'auteur Jonathan Leffler
Généralement, vous souhaitez employer une sorte de système de journalisation qui pourrait (essayer) de gérer cela pour vous, ou vous aurez besoin de dupliquer cette logique dans tous les domaines de votre code qui imprime à la norme erreur et s'arrête.
Vous avez quelques options:
D'ailleurs,
open()
read()
etwrite()
sont de bons amis à avoir lorsque la fprintf famille de fonctions ne fonctionnent pas.Comme whitey04 dit, parfois vous avez juste à donner et à faire de votre mieux pour ne pas fondre avec des feux d'artifice. Mais essayer d'isoler ce genre de logique dans une petite bibliothèque.
Par exemple:
Est beaucoup plus propre que d'une série de
if
else
else if
chaque endroit, les choses pourraient peut-être faire de mal.OriginalL'auteur Tim Post
Vous pourriez mettre l'erreur sur la sortie standard stdout ou quelque part d'autre... À un certain moment, vous avez juste à fournir les rapports d'erreur en mieux, et puis abandonner.
L'essentiel est que votre application "normalement" qu'il gère (par exemple, le système d'exploitation n'a pas à tuer pour être mauvais et il vous dit pourquoi il a quitté [si possible]).
OriginalL'auteur whitey04
Oui, bien sûr
fprintf
àstderr
peut échouer. Par exemplestderr
pourrait être un fichier ordinaire et le disque pourrait manquer d'espace, ou il pourrait être un tuyau qui se ferme par le lecteur, etc.Si vous devriez vérifier le fonctionnement de l'échec dépend en grande partie sur si vous pourriez obtenir de meilleurs le programme, par la vérification. Dans votre cas, la seule concevable choses que vous pourriez faire en cas d'échec pour imprimer le message d'erreur sont essayez d'imprimer un autre (qui sera presque certainement aussi à l'échec), ou de quitter le programme (qui est pire que de ne pas signaler une erreur, mais peut-être pas toujours).
OriginalL'auteur R..
Certains programmes qui vraiment souhaitez enregistrer des messages d'erreur va mettre en place un suppléant de la pile au démarrage du programme pour réserver une certaine quantité de mémoire (voir sigaltstack(2) qui peut être utilisé par un gestionnaire de signal (généralement
SIGSEGV
) pour signaler les erreurs. Selon l'importance de l'enregistrement de votre erreur, vous pouvez enquêter sur l'utilisation d'autres piles de pré-allouer un bloc de mémoire. Il pourrait ne pas être en vaut la peine 🙂 mais parfois vous donnerais n'importe quoi pour certains soupçon de ce qui s'est passé.OriginalL'auteur sarnold