9

我正在将SDL用于在 Linux 上运行的 OpenGL 应用程序。我的问题是 SDL 正在捕获 SIGINT 并忽略它。这很痛苦,因为我正在通过屏幕会话进行开发,并且无法使用 CTRL-C 终止正在运行的程序(计算机正在运行的程序连接到投影仪并且没有输入设备)。

有没有我可以传递给 SDL 的标志或其他东西,这样它就不会捕获 SIGINT?我真的只是希望程序在收到信号时停止(即当我按下 ctrl-c 时)。

4

5 回答 5

10

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

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

于 2009-04-13T15:48:30.530 回答
5

我找到了答案:

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

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

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

感谢缓存您的输入,它让我走上了正确的轨道。

迈克尔

于 2009-03-24T03:12:01.417 回答
3

将初始化标志传递SDL_INIT_NOPARACHUTE给 SDL_Init “防止 SDL 捕获致命信号”。


见:http ://www.libsdl.org/cgi/docwiki.cgi/SDL_Init

于 2009-03-24T02:49:33.377 回答
2

在 SDL_quit.c 中,检查提示以确定是否不应在SDL_QuitInit(). 当最初的问题被问到时,不确定这是否存在于旧版本中,但对于那些刚来这里的人来说可能很方便。

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

SDL_SetHint(SDL_HINT_NO_SIGNAL_HANDLERS, "1");
SDL_Init(...);
于 2016-03-22T23:08:45.090 回答
1

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

于 2012-08-31T09:35:31.223 回答