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

StackOverflow https://stackoverflow.com/questions/675980

  •  21-08-2019
  •  | 
  •  

Вопрос

Я использую СДЛ для приложения 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 перехват фатальных сигналов».


Видеть: http://www.libsdl.org/cgi/docwiki.cgi/SDL_Init

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

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

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

SDL_SetHint(SDL_HINT_NO_SIGNAL_HANDLERS, "1");
SDL_Init(...);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top