2009-03-24 14 views
10

Używam aplikacji SDL dla aplikacji OpenGL, działającej pod kontrolą systemu Linux. Mój problem polega na tym, że SDL łapie SIGINT i ignoruje go. To jest ból, ponieważ rozwijam się poprzez sesję ekranową i nie mogę zabić uruchomionego programu za pomocą CTRL-C (program, na którym działa komputer, jest podłączony do projektora i nie ma urządzeń wejściowych).Program OpenGL SDL/C++, jak zatrzymać przechwytywanie SDL SIGINT

Czy jest flaga lub coś, co mogę przekazać do SDL, aby nie przechwycić SIGINT? Naprawdę chcę po prostu, aby program zatrzymał się po odebraniu sygnału (tj. Po naciśnięciu ctrl-c).

Odpowiedz

11

Ctrl-C na konsoli generuje zdarzenie SDL_QUIT. Możesz oglądać to zdarzenie za pomocą SDL_PollEvent lub SDL_WaitEvent i wyjść (czysto) po wykryciu.

Należy zauważyć, że inne działania mogą generować zdarzenie SDL_QUIT (np. Próbować zamknąć główne okno za pomocą menedżera okien).

5

znalazłem odpowiedź:

Flaga SDL_INIT_NOPARACHUTE będzie przechwytywać sygnały tak fatalne, że SDL może posprzątać po sobie. Działa na rzeczy takie jak SIGSEGV, ale najwyraźniej SIGINT nie jest wystarczająco fatalny.

Moje rozwiązaniem jest zresetowanie obsługi sygnału do SIGINT po SDL został zainicjowany:

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

Dzięki Cache dla wybierzemy, to umieścić mnie na właściwe tory.

Michael

+1

Prawidłowym sposobem rozwiązania tego problemu byłoby wysłuchanie zdarzeń SDL_QUIT, o których wspominał Steve S. – Grumbel

1

Jeśli z jakiegoś powodu nie używasz pętli zdarzeń, możesz użyć SDL_QuitRequested w pętli "poll stuff".

1

W pliku SDL_quit.c znajduje się podpowiedź wskazująca, czy procedury obsługi sygnałów nie powinny być używane w SDL_QuitInit(). Nie jestem pewien, czy istniało to w starszych wersjach po zadaniu pytania oryginalnego, ale może być przydatne dla tych, którzy przyjdą tutaj świeżo.

Wystarczy testowane na mojej aplikacji Windows, mogę teraz otrzymać wszystkie sygnały prawidłowo ponownie, używając:

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