Pregunta

Estoy utilizando SDL para una aplicación OpenGL, que se ejecuta en Linux. Mi problema es que SDL es la captura de SIGINT y haciendo caso omiso de ella. Este es un dolor porque estoy desarrollando a través de una sesión de pantalla, y no puedo matar al programa en ejecución con CTRL-C (el programa de ordenador se ejecuta en está conectado a un proyector y no tiene dispositivos de entrada).

¿Hay una bandera o algo que pueda pasar a SDL para que no captura SIGINT? Realmente sólo quiero que el programa se detiene cuando se recibe la señal (es decir, al pulsar Ctrl-C).

¿Fue útil?

Solución

Ctrl-C en la consola genera un evento SDL_Quit. Usted puede ver para este evento usando SDL_PollEvent o SDL_WaitEvent, y la salida (limpiamente) cuando se detecta.

Tenga en cuenta que otras acciones pueden generar un evento SDL_Quit (por ejemplo intentar cerrar la ventana principal a través del gestor de ventanas).

Otros consejos

He encontrado una respuesta:

La bandera SDL_INIT_NOPARACHUTE captará señales fatales para que SDL puede limpiar después de sí mismo. Funciona para cosas como SIGSEGV, pero al parecer no es suficiente SIGINT fatal.

Mi solución es restablecer el manejador de la señal de SIGINT después de SDL se ha inicializado:

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

Gracias caché para usted de entrada, que me puso en el camino correcto.

Michael

Pasando el SDL_INIT_NOPARACHUTE bandera de inicialización a SDL_Init "Evita SDL de la captura de señales fatales".


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

Si usted no está realmente utilizando un bucle de eventos por alguna razón, puede utilizar SDL_QuitRequested en su bucle "cosas sondeo".

En SDL_quit.c, hay un cheque en busca de pistas para determinar si los manejadores de señales no deben ser utilizados en SDL_QuitInit(). No estoy seguro si esto existía en las versiones anteriores, cuando se hizo la pregunta original, pero puede ser muy útil para los que vienen aquí fresco.

Sólo probado en mi aplicación de Windows, ahora puedo recibir todas las señales correctamente de nuevo, usando:

SDL_SetHint(SDL_HINT_NO_SIGNAL_HANDLERS, "1");
SDL_Init(...);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top