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).

Était-ce utile?

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".


Voir: http://www.libsdl.org/cgi/ docwiki.cgi / SDL_Init

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(...);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top