2017-07-07 12 views
0

Solaris X86プラットフォームでC++でコーディングされた修正イニシエータアプリケーションを実行しています。 通常のベースでアプリケーションを起動および停止するには、シェルスクリプトラッパーおよびcronを使用します。これは、停止するためにアプリケーションのPIDを強制終了します。 killは直ちに修正セッションで適切なログアウトをせずに完全なプロセスをシャットダウンし、ソケットで切断したり、ファイルハンドルを削除したりするので、innitiatorを停止するためにはよりエレガントでプロフェッショナルな方法があるのだろうかと思います。quickfix-initiatorを停止する方法

修正アプリケーション内でSIGINTを処理する方法についてのアドバイスや例を挙げることはできますか?

答えて

1

sigactionをご覧ください。これは実際に必要なものです。使用方法の例はhereですが、確かにCですが、C++でも同様です。

signalが扱いやすい(真実...)ことを発見した場合は、それを避けてください(リンクを参照してください)。 ..)。

は、シグナルハンドラを持つから、あなただけの非同期安全な関数を使用することが許可されていることを、あまりにも、注意してください...

は、デフォルトでキルはSIGTERMを送ることに注意してください、これはあなたが実際にキャッチする必要があるものです!リストは含まれていますhere

あなたのプログラムはいくつかのループ内で実行されていると仮定します。非同期セーフではない関数の問題を回避するには、シグナルハンドラのループ条件をリセットし、残りの部分がメインスレッドをもう一度処理するようにするだけです(ループを破って後でクリーンアップする)。

IOをブロックすることに頼っているのであれば、selectまたはpollへのコールを導入することができます(まだ実行されていない場合)。シグナルハンドラからアクティブにするファイル記述子を追加して、選択/ポーリングを早めに中断することができます。

eventfdで入手できる追加のファイルハンドラですが、これはLinux特有のものです。または、パイプを開いてシグナルハンドラ内から書き込むことで移植性が向上します。

関連する問題