2009-03-24 12 views
10

Estoy usando SDL para una aplicación OpenGL que se ejecuta en Linux. Mi problema es que SDL está detectando SIGINT e ignorándolo. Esto es un problema porque estoy desarrollando a través de una sesión de pantalla, y no puedo matar el programa en ejecución con CTRL-C (el programa en el que se ejecuta la computadora está conectado a un proyector y no tiene dispositivos de entrada).Programa SDL/C++ OpenGL, ¿cómo evito que SDL capture SIGINT

¿Hay alguna bandera o algo que pueda pasar a SDL para que no capture SIGINT? Realmente solo quiero que el programa se detenga cuando reciba la señal (es decir, cuando presione ctrl-c).

Respuesta

11

Ctrl-C en la consola genera un evento SDL_Quit. Puede mirar este evento usando SDL_PollEvent o SDL_WaitEvent, y salir (limpiamente) cuando se detecta.

Tenga en cuenta que otras acciones pueden generar un evento SDL_QUIT (por ejemplo, intentar cerrar su ventana principal a través del administrador de ventanas).

5

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 aparentemente SIGINT no es lo suficientemente 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

+1

La forma correcta de resolver este problema sería escuchando eventos SDL_QUIT como Steve S mencionó. – Grumbel

1

Si no está utilizando realmente un bucle de evento por alguna razón, puede usar SDL_QuitRequested en su bucle "poll stuff".

1

En SDL_quit.c, hay una comprobación de sugerencias para determinar si los controladores de señal no se deben utilizar en SDL_QuitInit(). No estoy seguro de si esto existía en versiones anteriores cuando se formuló la pregunta original, pero puede ser útil para quienes vengan aquí frescos.

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

SDL_SetHint(SDL_HINT_NO_SIGNAL_HANDLERS, "1"); 
SDL_Init(...); 
Cuestiones relacionadas