SDL / C ++ programme OpenGL, comment puis-je arrêter SDL d'attraper SIGINT
Question
J'utilise SDL pour une application OpenGL, fonctionnant sous Linux. Mon problème est que SDL rattrape SIGINT et ignorant. Ceci est une douleur parce que je développe à travers une séance d'écran, et je ne peux pas tuer le programme en cours avec CTRL-C (le programme de l'ordinateur est en cours d'exécution sur est connecté à un projecteur et n'a pas les périphériques d'entrée).
Y at-il un drapeau ou quelque chose que je peux passer à SDL afin qu'il ne tient pas compte SIGINT? Je veux vraiment juste le programme pour arrêter quand il reçoit le signal (à savoir quand j'appuyez sur Ctrl-c).
La solution
Ctrl-C sur la console génère un événement d'SDL_Quit. Vous pouvez regarder cet événement en utilisant SDL_PollEvent ou SDL_WaitEvent, et la sortie (proprement) lorsqu'il est détecté.
Notez que d'autres actions peuvent générer un événement SDL_Quit (par exemple en essayant de fermer la fenêtre principale via le gestionnaire de fenêtres).
Autres conseils
J'ai trouvé une réponse:
Le drapeau SDL_INIT_NOPARACHUTE capture des signaux mortels de sorte que SDL peut nettoyer après lui-même. Il fonctionne pour des choses comme SIGSEGV, mais apparemment SIGINT ne suffit pas fatale.
Ma solution consiste à réinitialiser le gestionnaire de signaux à SIGINT après SDL a été initialisé:
SDL_Init(SDL_INIT_VIDEO | SDL_INIT_NOPARACHUTE);
signal(SIGINT, SIG_DFL);
Merci Cache pour vous l'entrée, il m'a mis sur la bonne voie.
Michael
En passant le drapeau d'initialisation à SDL_Init SDL_INIT_NOPARACHUTE
"Evite SDL de la capture des signaux mortels".
Si vous ne l'utilisez en fait une boucle d'événement pour une raison quelconque, vous pouvez utiliser dans votre boucle SDL_QuitRequested
« stuff vote rapide ».
Dans SDL_quit.c, il y a un chèque de conseils pour déterminer si les gestionnaires de signaux ne doivent pas être utilisés dans SDL_QuitInit()
. Je ne sais pas si cela existait dans les anciennes versions quand on a posé la question initiale, mais peut être utile pour ceux qui viennent ici frais.
Juste testé sur mon application Windows, je peux maintenant recevoir tous les signaux correctement à nouveau, en utilisant:
SDL_SetHint(SDL_HINT_NO_SIGNAL_HANDLERS, "1");
SDL_Init(...);