SDL / C ++ OpenGL程序,如何阻止SDL捕获SIGINT

我正在使用SDL运行在Linux上的OpenGL应用程序。 我的问题是SDL正在捕获SIGINT并忽略它。 这是一个痛苦,因为我正在通过屏幕会话进行开发,而且我不能用CTRL-C(运行计算机的程序连接到投影机而没有input设备)中断正在运行的程序。

有没有一个标志或我可以传递给SDL,以便它不捕获SIGINT? 我真的只是想让程序停止,当它收到信号(即当我按Ctrl-C)。

控制台上的Ctrl-C生成一个SDL_QUIT事件。 您可以使用SDL_PollEvent或SDL_WaitEvent监视此事件,并在检测到时退出(干净地)。

请注意,其他操作可能会生成SDL_QUIT事件(例如尝试通过窗口管理器关闭主窗口)。

我找到了答案:

SDL_INIT_NOPARACHUTE标志将捕获致命的信号,以便SDL自行清理。 它适用于像SIGSEGV这样的东西,但显然SIGINT不够致命。

我的解决方案是在SDL初始化后将信号处理程序重置为SIGINT:

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

如果由于某种原因您实际上没有使用事件循环,则可以在“poll stuff”循环中使用SDL_QuitRequested

在SDL_quit.c中,检查提示以确定是否不应该在SDL_QuitInit()使用信号处理程序。 不确定这个问题是否存在于原始问题的旧版本中,但对于那些来到这里的人来说可能会很方便。

刚在我的Windows应用程序上测试过,我现在可以再次正确地接收所有信号,使用:

 SDL_SetHint(SDL_HINT_NO_SIGNAL_HANDLERS, "1"); SDL_Init(...);