4

Unix で C++ を使用しています。

たとえば、ファイルから内容を読み取って解析するなど、長時間実行される関数があるとします。この関数では、ファイルから読み取ったものの数をローカル変数に保持しますnum_read

カスタム シグナル ハンドラで CTRL+c をキャッチし、 の値を出力したいと考えていますnum_read

私が考えることができる唯一の方法はnum_read、ヒープに割り当て、そのアドレスをシグナルハンドラーからアクセスできるグローバル変数に格納することです。もっとエレガントな方法はありますか?

4

2 に答える 2

4

答えはノーだ。グローバル変数以外に、シグナル ハンドラと残りのコードとの間で通信する方法はありません。

また、シグナルハンドラで実行できることは非常に限られています。たとえば、 に対して を使用したり<<、を呼び出したりすることはできません。Unix でシグナルを処理する通常の方法は、シグナルを別のスレッドでキャッチすることです。別の方法 (他の OS でも機能します) は、シグナル ハンドラで設定され、メイン ループでポーリングされる のグローバル変数を定義することです。(たとえば、あなたの場合、更新するたびにポーリングする可能性があります 。)std::ostreamprintfsig_atomic_tnum_read

于 2012-12-18T09:36:55.813 に答える
3

シグナル ハンドラを使用する伝統的な Unix の方法を除いて、他にも次の方法があります。

  • Linux カーネル 2.6.22 以降、signalfd()関数が存在します。通常のファイル記述子を取得し、 (selectまたはを使用してepoll) 着信シグナルをポーリングすることができます。したがって、シグナルを処理する場合、それらに固有の制限はありません。これは通常のユーザー空間コードであるため、好きなように呼び出すことができます...
  • OS Xについて私が知る限り、kqueueにも同様の機能があります(このサイトまたはインターネットで検索しEVFILT_SIGNALてくださいkqueue
于 2012-12-18T12:39:07.003 に答える