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

Mic*_*elM 9 c++ linux signals sdl

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

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

Ste*_*e S 10

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

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


ZXc*_*bnM 8

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

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

SDL_SetHint(SDL_HINT_NO_SIGNAL_HANDLERS, "1");
SDL_Init(...);
Run Code Online (Sandbox Code Playgroud)


Mic*_*elM 5

我找到了答案:

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

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

SDL_Init(SDL_INIT_VIDEO | SDL_INIT_NOPARACHUTE);
signal(SIGINT, SIG_DFL); 
Run Code Online (Sandbox Code Playgroud)

谢谢你输入缓存,它让我走在正确的轨道上.

迈克尔