Я нашел ответ:
Флаг SDL_INIT_NOPARACHUTE будет захватывать фатальные сигналы, чтобы SDL мог очищаться после себя. Он работает для таких вещей, как SIGSEGV, но, видимо, SIGINT недостаточно опасен.
Мое решение состоит в том, чтобы сбросить обработчик сигнала на SIGINT после инициализации SDL:
SDL_Init(SDL_INIT_VIDEO | SDL_INIT_NOPARACHUTE);
signal(SIGINT, SIG_DFL);
Спасибо Cache за ваш вклад, он поставил меня на правильный путь.
Michael