代码之家  ›  专栏  ›  技术社区  ›  MichaelM

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

  •  9
  • MichaelM  · 技术社区  · 17 年前

    我正在使用 SDL 对于在Linux上运行的OpenGL应用程序。我的问题是SDL正在捕获sigint并忽略它。这是一种痛苦,因为我是通过一个屏幕会话来开发的,我不能用ctrl-c终止正在运行的程序(计算机运行的程序连接到投影仪,没有输入设备)。

    是否有一个标志或一些我可以传递给SDL以便它不捕获sigint的东西?我真的只是希望程序在接收到信号时停止(即按ctrl-c)。

    5 回复  |  直到 17 年前
        1
  •  10
  •   Steve S    17 年前

    控制台上的ctrl-c生成一个sdl_quit事件。您可以使用sdl_pollEvent或sdl_waitEvent监视此事件,并在检测到它时退出(干净地)。

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

        2
  •  5
  •   MichaelM    17 年前

    我找到了一个答案:

    sdl_init_nopararaflatp标志将捕获致命信号,以便sdl可以在自身清理之后进行清理。它适用于sigsegv之类的东西,但显然sigint还不够致命。

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

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

    感谢缓存为您输入,它把我放在正确的轨道上。

    迈克尔

        3
  •  3
  •   Functastic    17 年前

    路过 SDL_INIT_NOPARACHUTE 初始化标志为sdl_init“防止sdl捕获致命信号”。


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

        4
  •  1
  •   AI0867 Ilya Khaprov    14 年前

    如果出于某种原因没有实际使用事件循环,则可以使用 SDL_QuitRequested 在你的“民意调查”循环中。

        5
  •  1
  •   ZXcvbnM    10 年前

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

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

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