2009-03-24 7 views
10

J'utilise SDL pour une application OpenGL fonctionnant sous Linux. Mon problème est que SDL attrape SIGINT et l'ignore. C'est une douleur parce que je suis en développement à travers une session d'écran, et je ne peux pas tuer le programme en cours avec CTRL-C (le programme sur lequel l'ordinateur fonctionne est connecté à un projecteur et n'a pas de périphériques d'entrée).Programme OpenGL SDL/C++, comment empêcher le SDL d'intercepter SIGINT?

Y a-t-il un drapeau ou quelque chose que je peux transmettre à SDL pour qu'il ne capture pas SIGINT? Je veux juste que le programme s'arrête quand il reçoit le signal (c'est-à-dire quand j'appuie sur ctrl-c).

Répondre

11

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 quitter (proprement) quand il est détecté.

Notez que d'autres actions peuvent générer un événement SDL_QUIT (par exemple en tentant de fermer votre fenêtre principale via le gestionnaire de fenêtres).

3

Passage de l'indicateur d'initialisation SDL_INIT_NOPARACHUTE à SDL_Init "Empêche le SDL d'intercepter les signaux fatals".


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

+0

Le drapeau NOPARACHUTE ne semble pas attraper SIGINT, seuls les problèmes mortels comme des erreurs de segmentation, etc. – MichaelM

5

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. Cela fonctionne pour des choses comme SIGSEGV, mais apparemment SIGINT n'est pas assez fatal.

Ma solution est de réinitialiser le gestionnaire de signal SIGINT après SDL a été initialisées:

SDL_Init(SDL_INIT_VIDEO | SDL_INIT_NOPARACHUTE); 
signal(SIGINT, SIG_DFL); 

Merci Cache pour vos commentaires, il m'a mis sur la bonne voie.

Michael

+1

La façon correcte de résoudre ce problème serait d'écouter les événements SDL_QUIT comme mentionné par Steve S. – Grumbel

1

Si vous n'utilisez pas une boucle d'événement pour une raison ou une autre, vous pouvez utiliser SDL_QuitRequested dans votre boucle d'interrogation.

1

Dans SDL_quit.c, il y a une vérification des indicateurs 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 lorsque la question initiale a été posée, mais peut être utile pour ceux qui viennent ici frais.

Tout 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(...); 
Questions connexes