J'ai remarqué que quand un programme se prend une erreur de segmentation dans sa poire, il ne flush() pas ses sorties (pas testé pour d'autres signaux). Ça m'embête profondément pour un de mes projets, où les logs seront le seul moyen de déterminer ce qui s'est mal passé. J'ai donc décidé d'intercepter SIGSEGV, et de flush()er dans le handler (si vous avez une meilleure méthode, je suis preneur, sachant que c'est la seule modification autorisée dans le programme qui plantera potentiellement), un peu comme ça:
#include "stdio.h"
#include "signal.h"
void quitandclean() {
fclose(stdout);
fclose(stderr);
}
int main() {
char *x = NULL;
signal(SIGSEGV, quitandclean);
fprintf(stdout, "foo");
fprintf(stderr, "bar");
*x = 0;
}
Et là, horreur: le programme ne se termine plus en cas d'erreur de segmentation. Qu'ai-je donc mal fait ? (ce sera le "chercher l'erreur" du week-end ;))
# Le HANDLER !
Posté par Obsidian . Évalué à 6.
Ben t'as remplacé le handler par défaut, celui-là même qui est en charge de tuer ton programme, par le tien, et tu ne lui as rien dit d'autre. À titre d'info, la fonction signal() renvoie un sighandler du comportement précédant l'appel. Colle ça dans un registre de ton programme et rappelle-le manuellement à la fin de ta fonction.
si vous avez une meilleure méthode, je suis preneur
$ man setbuf
# Normal
Posté par ✅ ffx . Évalué à 4.
Il faut que tu ajoutes un appel du genre _exit(ERROR_CODE); dans ton quitandclean.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.