2009-03-24 12 views
10

Sto utilizzando SDL per un'applicazione OpenGL, in esecuzione su Linux. Il mio problema è che SDL sta prendendo SIGINT e lo ignora. Questo è un dolore perché sto sviluppando attraverso una sessione di schermate e non posso uccidere il programma in esecuzione con CTRL-C (il programma su cui è in esecuzione il computer è collegato a un proiettore e non ha dispositivi di input).Programma OpenGL SDL/C++, come posso impedire a SDL di intercettare SIGINT

C'è un flag o qualcosa che posso passare a SDL in modo che non acquisisca SIGINT? Voglio davvero che il programma si fermi quando riceve il segnale (cioè quando premo ctrl-c).

risposta

11

Ctrl-C sulla console genera un evento SDL_QUIT. È possibile guardare questo evento utilizzando SDL_PollEvent o SDL_WaitEvent e uscire (pulito) quando viene rilevato.

Si noti che altre azioni possono generare un evento SDL_QUIT (ad esempio il tentativo di chiudere la finestra principale tramite il gestore finestre).

5

ho trovato una risposta:

La bandiera SDL_INIT_NOPARACHUTE catturerà segnali fatali in modo che SDL possa pulire dopo se stessa. Funziona per cose come SIGSEGV, ma a quanto pare SIGINT non è abbastanza fatale.

La mia soluzione è quella di ripristinare il gestore del segnale di SIGINT dopo SDL è stato inizializzato:

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

Grazie cache per voi di ingresso, mi ha messo sulla strada giusta.

Michael

+1

Il modo corretto per risolvere questo problema sarebbe ascoltando gli eventi SDL_QUIT come menzionato da Steve S. – Grumbel

1

Se non si utilizza effettivamente un ciclo di eventi per qualche motivo, è possibile utilizzare SDL_QuitRequested nel proprio ciclo "poll stuff".

1

In SDL_quit.c, è disponibile un controllo per suggerimenti per determinare se i gestori di segnale non devono essere utilizzati in SDL_QuitInit(). Non sono sicuro se questo esisteva nelle versioni precedenti quando veniva posta la domanda originale, ma potrebbe essere utile per chi viene qui fresco.

appena testato sulla mia applicazione Windows, ora posso ricevere tutti i segnali di nuovo correttamente, utilizzando:

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