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).

È stato utile?

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".


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

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(...);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top