SDL / OpenGL ++ Programma C, come faccio a smettere di SDL dalla cattura SIGINT
Domanda
SDL per un'applicazione OpenGL, in esecuzione su Linux. Il mio problema è che SDL sta recuperando SIGINT e ignorarlo. Questo è un dolore perché sto sviluppando attraverso una sessione di screen, e non riesco a uccidere il programma in esecuzione con CTRL-C (il programma sul computer è in esecuzione è collegato ad un proiettore e non ha dispositivi di input).
C'è una bandiera o qualcosa che posso passare a SDL in modo che non cattura SIGINT? Voglio davvero solo il programma per fermare quando riceve il segnale (ad esempio quando si preme ctrl-c).
Soluzione
Ctrl-C sulla console genera un evento SDL_QUIT. Puoi guardare per questo evento usando SDL_PollEvent o SDL_WaitEvent, e l'uscita (in modo pulito) quando viene rilevato.
Si noti che le altre azioni in grado di generare un evento SDL_QUIT (ad esempio il tentativo di chiudere la finestra principale attraverso il window manager).
Altri suggerimenti
Ho trovato una risposta:
La bandiera SDL_INIT_NOPARACHUTE catturerà segnali fatali in modo che SDL possa pulire dopo se stessa. Si lavora per cose come SIGSEGV, ma a quanto pare non è sufficiente SIGINT 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
Passando il SDL_INIT_NOPARACHUTE
bandiera inizializzazione di SDL_Init "Previene SDL dalla cattura segnali fatali".
Se non si è in realtà utilizzando un ciclo di eventi per qualche motivo, è possibile utilizzare SDL_QuitRequested
nel ciclo "roba sondaggio".
In SDL_quit.c, c'è un assegno per i suggerimenti per determinare se i gestori di segnale non devono essere utilizzati in SDL_QuitInit()
. Non so se questo esistesse nelle versioni precedenti, quando la domanda iniziale è stato chiesto, ma può essere utile per chi viene qui fresco.
Proprio testato su mia applicazione di Windows, ora posso ricevere tutti i segnali di nuovo correttamente, utilizzando:
SDL_SetHint(SDL_HINT_NO_SIGNAL_HANDLERS, "1");
SDL_Init(...);