Программа SDL/C++ OpenGL, как остановить SDL от перехвата SIGINT

Я использую SDL для приложения OpenGL, работающего в Linux. Моя проблема в том, что SDL ловит SIGINT и игнорирует его. Это боль, потому что я разрабатываю через сеанс экрана и не могу убить работающую программу с помощью CTRL-C (программа, на которой работает компьютер, подключена к проектору и не имеет устройств ввода).

Есть ли флаг или что-то, что я могу передать SDL, чтобы он не перехватывал SIGINT? Я действительно просто хочу, чтобы программа останавливалась, когда она получает сигнал (т.е. когда я нажимаю ctrl-c).


person MichaelM    schedule 24.03.2009    source источник


Ответы (5)


Ctrl-C на консоли генерирует событие SDL_QUIT. Вы можете наблюдать за этим событием, используя SDL_PollEvent или SDL_WaitEvent, и выйти (чисто) при его обнаружении.

Обратите внимание, что другие действия могут генерировать событие SDL_QUIT (например, попытка закрыть главное окно через оконный менеджер).

person Steve S    schedule 13.04.2009

Я нашел ответ:

Флаг SDL_INIT_NOPARACHUTE будет захватывать фатальные сигналы, чтобы SDL мог очиститься после себя. Это работает для таких вещей, как SIGSEGV, но, по-видимому, SIGINT недостаточно фатален.

Мое решение состоит в том, чтобы сбросить обработчик сигнала в SIGINT после инициализации SDL:

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

Спасибо Кэш за ваш вклад, это поставило меня на правильный путь.

Майкл

person MichaelM    schedule 24.03.2009
comment
Правильным способом решения этой проблемы было бы прослушивание событий SDL_QUIT, как упоминал Стив С. - person Grumbel; 10.09.2009

Передача флага инициализации SDL_INIT_NOPARACHUTE в SDL_Init «Предотвращает перехват SDL фатальных сигналов».


См.: http://www.libsdl.org/cgi/docwiki.cgi/SDL_Init

person Functastic    schedule 24.03.2009
comment
Флаг NOPARACHUTE, похоже, не улавливает SIGINT, а только фатальные проблемы, такие как ошибки сегментации и т. д. - person MichaelM; 24.03.2009

В SDL_quit.c есть проверка подсказок, чтобы определить, не следует ли использовать обработчики сигналов в SDL_QuitInit(). Не уверен, что это существовало в более старых версиях, когда задавался исходный вопрос, но может быть удобно для тех, кто приходит сюда свежим.

Только что протестированный в моем приложении Windows, теперь я снова могу правильно получать все сигналы, используя:

SDL_SetHint(SDL_HINT_NO_SIGNAL_HANDLERS, "1");
SDL_Init(...);
person ZXcvbnM    schedule 22.03.2016

Если по какой-то причине вы на самом деле не используете цикл событий, вы можете использовать SDL_QuitRequested в своем цикле "опрос".

person AI0867    schedule 31.08.2012