我使用 SDL 一个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