URL: https://linuxfr.org/forums/programmation-c--2/posts/intercepter-sigsegv Title: Intercepter SIGSEGV Authors: Moonz Date: 2008年06月27日T19:28:51+02:00 Tags: Score: 0 Salut à tous, 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() { £spaces£ £/spaces£fclose(stdout); £spaces£ £/spaces£fclose(stderr); } int main() { £spaces£ £/spaces£char *x = NULL; £spaces£ £/spaces£signal(SIGSEGV, quitandclean); £spaces£ £/spaces£fprintf(stdout, "foo"); £spaces£ £/spaces£fprintf(stderr, "bar"); £spaces£ £/spaces£*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 ;))