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

Posted

技术标签:

【中文标题】SDL/C++ OpenGL 程序,如何阻止 SDL 捕获 SIGINT【英文标题】:SDL/C++ OpenGL Program, how do I stop SDL from catching SIGINT 【发布时间】:2009-03-24 02:37:54 【问题描述】:

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

是否有一个标志或什么我可以传递给 SDL 以使其不捕获 SIGINT?我真的只是希望程序在收到信号时停止(即当我按下 ctrl-c 时)。

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

【参考方案2】:

我找到了答案:

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

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

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

感谢 Cache 的输入,它让我走上了正轨。

迈克尔

【讨论】:

解决这个问题的正确方法是监听 Steve S 提到的 SDL_QUIT 事件。【参考方案3】:

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

请参阅:http://www.libsdl.org/cgi/docwiki.cgi/SDL_Init

【讨论】:

NOPARACHUTE 标志似乎没有捕获 SIGINT,只有分段错误等致命问题。【参考方案4】:

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

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

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

【讨论】:

【参考方案5】:

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

【讨论】:

以上是关于SDL/C++ OpenGL 程序,如何阻止 SDL 捕获 SIGINT的主要内容,如果未能解决你的问题,请参考以下文章

编译 sdl c 程序时“sdl-config”是啥意思?

opengl刷新界面时要怎么阻止windows窗口重绘

SD从零开始51-54 信用控制范围, 信用范围数据维护, 自动信用控制, 信用控制-阻止后续功能

为啥绘制我的 OpenGL-ES VBO 网格会阻止其他三角形显示?

OpenGL 调用锁定/冻结

你如何阻止 UITapGestureRecognizer 捕捉每一次点击?