Comment fermer stdout et stderr en C?
J'ai besoin de fermer stdout et stderr pour l'un de mes C programme. Comment est-il possible sans quitter le programme en exécution?
source d'informationauteur Undefined
Vous devez vous connecter pour publier un commentaire.
Qu'avez-vous essayé? Ne pas
fclose
travail?Vous pouvez juste:
Pour quelqu'un de vous demander pourquoi vous pourriez vouloir faire cela, c'est une tâche courante pour un démon/service de processus sous Unix.
Cependant vous devez être conscient que la fermeture d'un descripteur de fichier peut avoir des conséquences inattendues:
fopen
ce descripteur de fichier (sur Linux, au moins) remplacera fd 1, c'est à dire la sortie standard stdout. Tout code qui utilise ensuite ce sera d'écrire dans ce fichier, qui peut ne pas être ce que vous souhaitiez.FILE*
pointeurs. Plus précisément:stdout
oustderr
(qui sontFILE*
pointeurs (voir leur définition) alors l'écriture de ces tandis queFILE*
est fermé est un comportement indéterminé. Ce sera probablement le plantage de votre programme, de façon inattendue, pas toujours au point du bug. Voir comportement indéfini.Rapide, une solution en ligne est de
freopen()
- À-dire/dev/null
/dev/console
sous Linux/OSX ounul
sur Windows. Alternativement, vous pouvez utiliser votre plate-forme de mise en œuvre de ré-ouvrir les descripteurs de fichier/poignées en tant que de besoin.Si vous voulez éviter que votre application à partir de l'écriture de la console, puis:
Sorties:
Remarque: toute tentative d'utilisation d'un pointeur de FICHIER après la fermeture du fichier est erroné. Je suis en train de faire dans ce cas pour illustrer simplement ce que la fermeture de ces descripteurs de fichiers pourrait faire pour votre application.
Avertissement: je ne suis pas expérimenté en C, mais récemment lu une diapositive qui répond à cette question directement par Jim Meyering, une RedHat employé et GNUlib responsable: https://www.gnu.org/ghm/2011/paris/slides/jim-meyering-goodbye-world.pdf. Je me contenterai de résumer.
TL;DR
Obtenir closeout.c et ses dépendances de GNUlib dans votre source, et de les appeler
comme première ligne dans la principale.
Sommaire
Tout d'abord, certains chefs d'avertissement, citant POSIX:
De fermeture du flux sans manipulation ses erreurs n'est pas robuste, et il est le même pour stdout et stderr. Voici une liste des erreurs que vous devez gérer:
fclose(stdout)
ferror(stdout)
un.k.un. erreur précédente__fpending(stdout)
un.k.un. choses n'ont pas été vidéesDe la manipulation de ces erreurs, comme GNUlib met en œuvre dans proche-stream.cest cité ci-dessous.
Avis:
__fpending
est la particularité de la glibc et peuvent ne pas être portable. Otoh, que, c'est sur le chemin pour être normalisé commefpending
.P. S.:
Ce n'est pas une raison pour fermer la sortie standard stdout et stderr si vous écrivez un démon selon http://cloud9.hedgee.com./scribbles/daemon#logging. Vous devriez laisser un gestionnaire du démon (comme daemon tools, runit, s6, bouffe, OpenRC et systemd) gérer la redirection.
Cependant, vous devez fermer les flux que le programme n'a jamais écrit à la fin pour vérifier les erreurs. Citation de proximité-stream.c: