ハードウェアとのインターフェースが必要な C++ の Linux でアプリケーション (実際にはサービス/デーモン) を開発しています。私のプログラムが終了時にこのハードウェアのリソースをきれいに解放しない場合、デバイス ドライバーをリロードする必要があります。このプロセスには約 10 分かかり、明らかな理由で、プログラムの各テストの間に 10 分間待たなければなりません。イライラする。
そのため、関数を使用しsigaction()
て SIGINT (ctrl-c) をキャッチし、終了時にプログラムを完全にシャットダウンできるようにしました。コンソールからプログラムを実行すると、これは正常に機能します。ただし、Netbeans または Eclipse (私は両方を試しました) でデバッグすると、うまくいきません。
- Eclipse では、提供されるコンソールで ctrl-c を押しても、SIGINT が発生したことが登録されていないようです。
- Eclipse で、プログラムをデバッグ モードで実行してから を使用する
kill -SIGINT <pid>
と、プログラムはブレークポイントにヒットしたかのように中断します。 - コンソールで ctrl-c を押すと、Netbeans は実際にシグナルが送信されたことを認識しているようで、アプリケーションに転送するかどうかを尋ねるダイアログが表示されます。「転送して続行」をクリックすると、プログラムが壊れているように見え、信号がアプリケーションによって受信されません。また、存在しないメニュー項目である [デバッグ] -> [Dbx 構成] で、この内容を構成できるとも書かれています。
- Netbeans で、デバッグ モードでプログラムを実行してから を使用する
kill -SIGINT <pid>
と、動作は上記と同じです。 - 次に、SIGQUIT ハンドラーを追加し
kill
、Netbeans でのデバッグ時にそれを送信しようとしました。今回は、ダイアログは表示されず、シグナル ハンドラはトリップしません。
デバッグ中にアプリを完全にシャットダウンする方法が必要です。何か案は?