Программа SDL/C++ OpenGL, как мне запретить SDL перехватывать SIGINT
Вопрос
Я использую СДЛ для приложения OpenGL, работающего в Linux.Моя проблема в том, что SDL ловит SIGINT и игнорирует его.Это боль, потому что я занимаюсь разработкой через сеанс экрана и не могу завершить работающую программу с помощью CTRL-C (программа, над которой работает компьютер, подключена к проектору и не имеет устройств ввода).
Есть ли флаг или что-то, что я могу передать SDL, чтобы он не перехватывал SIGINT?На самом деле я просто хочу, чтобы программа остановилась, когда она получит сигнал (т. е. когда я нажму Ctrl-C).
Решение
Ctrl-C на консоли генерирует событие SDL_QUIT.Вы можете отслеживать это событие, используя SDL_PollEvent или SDL_WaitEvent, и выйти (чисто), когда оно будет обнаружено.
Обратите внимание, что другие действия могут генерировать событие SDL_QUIT (например,попытка закрыть главное окно через оконный менеджер).
Другие советы
Я нашел ответ:
Флаг SDL_INIT_NOPARACHUTE будет захватывать фатальные сигналы, чтобы SDL мог очиститься после себя.Это работает для таких вещей, как SIGSEGV, но, очевидно, SIGINT недостаточно фатален.
Мое решение — сбросить обработчик сигнала на SIGINT после инициализации SDL:
SDL_Init(SDL_INIT_VIDEO | SDL_INIT_NOPARACHUTE);
signal(SIGINT, SIG_DFL);
Спасибо Кешу за ваш вклад, это направило меня на правильный путь.
Майкл
Прохождение SDL_INIT_NOPARACHUTE
флаг инициализации для SDL_Init «Предотвращает SDL перехват фатальных сигналов».
Если по какой-то причине вы на самом деле не используете цикл событий, вы можете использовать SDL_QuitRequested
в вашем цикле «опросов».
В SDL_quit.c есть проверка подсказок, позволяющая определить, не следует ли использовать обработчики сигналов в SDL_QuitInit()
.Не уверен, существовало ли это в старых версиях, когда был задан исходный вопрос, но может быть полезно для тех, кто пришел сюда недавно.
Только что протестировав свое приложение для Windows, я теперь снова могу правильно принимать все сигналы, используя:
SDL_SetHint(SDL_HINT_NO_SIGNAL_HANDLERS, "1");
SDL_Init(...);