9

Linuxで実行されているOpenGLアプリケーションにSDLを使用しています。私の問題は、SDL が SIGINT をキャッチして無視していることです。私はスクリーン セッションを使って開発を行っており、実行中のプログラムを CTRL-C で強制終了することはできません (コンピューターが実行されているプログラムはプロジェクターに接続されており、入力デバイスはありません)。

SIGINTをキャプチャしないようにSDLに渡すことができるフラグまたは何かがありますか? プログラムがシグナルを受信したとき(つまり、ctrl-cを押したとき)にプログラムを停止したいだけです。

4

5 に答える 5

10

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

他のアクションが SDL_QUIT イベントを生成する可能性があることに注意してください (たとえば、ウィンドウ マネージャを介してメイン ウィンドウを閉じようとするなど)。

于 2009-04-13T15:48:30.530 に答える
5

私は答えを見つけました:

SDL_INIT_NOPARACHUTE フラグは致命的なシグナルを捕捉するので、SDL はそれ自体でクリーンアップできます。これは SIGSEGV などで機能しますが、どうやら SIGINT は十分に致命的ではありません。

私の解決策は、SDL が初期化された後にシグナル ハンドラを SIGINT にリセットすることです。

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

入力してくれたキャッシュに感謝します。それは私を正しい軌道に乗せました。

マイケル

于 2009-03-24T03:12:01.417 に答える
3

SDL_INIT_NOPARACHUTE初期化フラグを SDL_Init に渡すと、 「SDL が致命的なシグナルをキャッチできなくなります」。


参照: http://www.libsdl.org/cgi/docwiki.cgi/SDL_Init

于 2009-03-24T02:49:33.377 に答える
2

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

Windows アプリケーションでテストしたところ、次のコマンドを使用して、すべての信号を再び適切に受信できるようになりました。

SDL_SetHint(SDL_HINT_NO_SIGNAL_HANDLERS, "1");
SDL_Init(...);
于 2016-03-22T23:08:45.090 に答える
1

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

于 2012-08-31T09:35:31.223 に答える