Программа SDL / C ++ OpenGL, как мне остановить SDL от перехвата SIGINT? - PullRequest
9 голосов
/ 24 марта 2009

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

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

Ответы [ 5 ]

10 голосов
/ 13 апреля 2009

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

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

5 голосов
/ 24 марта 2009

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

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

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

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

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

Michael

3 голосов
/ 24 марта 2009

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


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

1 голос
/ 23 марта 2016

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

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

SDL_SetHint(SDL_HINT_NO_SIGNAL_HANDLERS, "1");
SDL_Init(...);
1 голос
/ 31 августа 2012

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

...