2012-02-01 5 views
3

この質問は私の個人的な好奇心が何よりも重要です。私はすべてのコードを少なくともWindowsとMacと互換性を保つようにしています。これまでのところ私は自分のコードをPOSIXに基づいて構築する必要があることを学んだが、それはちょうど素晴らしいですが...シグナルを扱うクロスプラットフォームのC++を書くにはどうすればよいですか?

Windowsにはsigactionという関数がありませんのでsignalが使用されていますか?によると: What is the difference between sigaction and signal?信号にいくつかの問題があります。

  1. 信号()関数は、現在のハンドラの実行中に到着からの他の信号をブロックしません。 sigaction()は現在のハンドラが返るまで他のシグナルをブロックすることができます。
  2. signal()関数は、ほぼすべての信号に対してシグナルアクションをSIG_DFL(デフォルト)に戻します。つまり、signal()ハンドラは最初のアクションとして自身を再インストールする必要があります。また、信号が検出され、ハンドラが再インストールされてから、信号の2番目のインスタンスが到着した場合、デフォルトの動作(通常は終了、時には偏見、つまりコアダンプ)が発生する脆弱性のウィンドウが開きます。

2つのSIGINTのは、アプリケーションがデフォルトの動作で終了しますすぐに来ている場合。この動作を修正する方法はありますか?これらの2つの問題は、例えばSIGINTをブロックしたいというプロセスに他にどのような影響がありますか?信号を使用している間に実行する可能性のある他の問題はありますか?どうすれば修正できますか?

+1

なぜ、ゲームでとにかく信号を使用したいのですか? – selbie

+1

'sigaction'をサポートするプラットフォームでは、' #define HAVE_SIGACTION'を行うことができます。次に、defineをチェックして、 'HAVE_SIGACTION'が定義されていなければ新しいdefine(' #define my_signal signal')を作成するか、定義されている場合は 'sigaction'を使って新しい関数(my_signal(...) 。 –

答えて

4

あなたは本当にsignal()を扱いたくありません。

"イベント"が必要です。

理想的には、ターゲットとするすべての主要環境に移植可能なフレームワークがあります。これは、「イベント」実装の選択を決定します。

ここで役立つかもしれない興味深いスレッドです:

Game Objects Talking To Each Other

はPS:) 信号の主な違いは()とは、sigaction()は(つまりは、sigactionであるステロイドの "信号()" である - よりオプション、SA_RESTARTなどを許可します。あなたが本当に必要な場合を除いて、どちらかを使用することをお勧めします。

+0

ありがとう!これは参考になります。 –

+1

また、http://gamedev.stackexchange.com/に興味があります。 – paulsm4