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

10

我正在使用SDL开发一个OpenGL应用程序,在Linux上运行。我的问题是,SDL捕获和忽略了SIGINT信号。这很麻烦,因为我通过一个screen会话进行开发,无法使用CTRL-C终止正在运行的程序(计算机正在运行的程序已连接到投影仪并没有输入设备)。

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

5个回答

11

在控制台中按下Ctrl-C会生成一个SDL_QUIT事件。您可以使用SDL_PollEvent或SDL_WaitEvent监视此事件,并在检测到时退出(清除状态)。

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


1
这不是一个解决方案;为了能够处理SDL_QUIT事件,您的代码需要能够将控制权交还给事件循环。如果被卡在无限循环中或长时间运行的进程中(如加载数据),它就无法做到这一点。 - Corentin Schreiber

7
在SDL_quit.c中,有一个检查提示的功能,用于确定是否应在SDL_QuitInit()中不使用信号处理程序。不确定在原始问题提出时是否存在此功能,但对于那些刚接触这个问题的人可能会很有用。
我在我的Windows应用程序上进行了测试,现在我可以再次正确地接收所有信号,使用以下内容:
SDL_SetHint(SDL_HINT_NO_SIGNAL_HANDLERS, "1");
SDL_Init(...);

在Linux上运行得很好。 - unlsycn

6
我找到了一个答案:
SDL_INIT_NOPARACHUTE标志可以捕获致命信号,以便SDL可以在自身清理后工作。它适用于像SIGSEGV这样的事情,但显然SIGINT不够致命。
我的解决方案是在SDL被初始化后将信号处理器重置为SIGINT:
SDL_Init(SDL_INIT_VIDEO | SDL_INIT_NOPARACHUTE);
signal(SIGINT, SIG_DFL); 

感谢Cache提供的帮助,让我找到了正确的方向。
迈克尔

1
解决这个问题的正确方法是像Steve S提到的那样监听SDL_QUIT事件。 - Grumbel

3

2
NOPARACHUTE标志似乎无法捕获SIGINT,只能捕获像分段错误等致命问题。 - MichaelM

1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接