2009-03-24 9 views
10

私はSDLをLinux上で動作するOpenGLアプリケーションに使用しています。私の問題は、SDLがSIGINTを捕まえて無視していることです。私は画面セッションを通して開発しているので、CTRL-C(コンピュータが実行されているプログラムはプロジェクタに接続されていて、入力デバイスはありません)で実行中のプログラムを強制終了することはできません。SDL/C++ OpenGLプログラム、SDLによるSIGINTの捕捉を停止する方法

SIGINTをキャプチャしないようにSDLに渡すことのできるフラグなどがありますか?私は実際には、信号を受信したとき(つまりCtrl-cを押したとき)にプログラムを停止させたいだけです。

答えて

11

はCtrl-CはSDL_QUITイベントを生成します。 SDL_PollEventまたはSDL_WaitEventを使用してこのイベントを監視し、検出されると終了します(きれいに)。

他のアクションでは、SDL_QUITイベントが生成されることがあります(たとえば、ウィンドウマネージャを使用してメインウィンドウを閉じるなど)。

3

SDL_INIT_NOPARACHUTE初期化フラグをSDL_Initに渡すことで、「SDLが致命的な信号をキャッチしないようにする」。


参照:私は答えを見つけたhttp://www.libsdl.org/cgi/docwiki.cgi/SDL_Init

+0

をNOPARACHUTEフラグがSIGINTをキャッチしていないようです、セグメンテーションフォールトのようなだけで致命的な問題は、など – MichaelM

5

:SDLは、それ自体の後にクリーンアップすることができるように

SDL_INIT_NOPARACHUTEフラグが致命的なシグナルをキャプチャします。これはSIGSEGVのようなもののために働くが、明らかにSIGINTは致命的ではない。

私のソリューションは、SDLが初期化された後にSIGINTにシグナルハンドラをリセットすることです:

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

おかげキャッシュあなたの入力のために、それは右のトラックに私を置きます。コンソールで

マイケル

+1

この問題を解決する正しい方法は、Steve Sが述べたようにSDL_QUITイベントを聞くことです。 – Grumbel

1

実際に何らかの理由でイベントループを使用していない場合は、「poll stuff」ループにSDL_QuitRequestedを使用できます。

1

SDL_quit.cには、SDL_QuitInit()でシグナルハンドラを使用しないかどうかを判断するヒントがあります。元の質問に尋ねられたときにこれが古いバージョンに存在するかどうかは不明ですが、ここに新しく来る人にとっては便利かもしれません。

ちょうど私のWindowsアプリケーション上でテストされ、私が今使用して、適切に再びすべての信号を受け取ることができます。

SDL_SetHint(SDL_HINT_NO_SIGNAL_HANDLERS, "1"); 
SDL_Init(...); 
関連する問題