2016-05-20 3 views
1

異なるサーバーで実行されている複数のプログラムに対して1つのシグナル処理関数を書いて、障害が発生したときなどに、セグメンテーションエラーSIGSEGVまたはSIGTERMなど、シグナル処理関数はログを生成し、内容を中央のMYSQLサーバにアップロードすることができます。これは、管理者に個々のサーバーを特定し、問題を修正するよう通知するためのものです。私の研究から、私はsigactionまたは例外処理を使用する必要があります。プログラムがフォールトに陥ったとき、シグナル処理関数でログを書き、ログをMYSQLにアップロードする方法は?

Q1:私の目的のために、(信号処理または例外処理)を使用する必要がありますか?

Q2:シグナルハンドラ関数でリエントラントでない関数を呼び出すことはお勧めできません。 printf()。この場合、どのようにログファイルを生成できますか?シグナル処理関数のログをアップロードするためにMYSQLに接続することもできますか?

私はC++とLinuxで作業しています。読んでいただきありがとうございます。

+1

'syslogd'の使用/実装をご覧ください –

答えて

0

あなたが正しいです、すべてのプログラムは信号に独自の反応を実装する必要があります!

Q1:sigaction()を使用すると、以前のsignal()と同じように精巧になります。

Q2:

  • シグナル処理は、全体のプロセスのための原子です。確かにprintf()を使うことはできますが、2番目のSIGSEGVを生成することはできません。
  • sigactionでは、シグナルハンドラ用に少量のスタックを予約します。この残りのスタックは、プログラムがスタックオーバーフローに陥った場合に便利です。シグナルハンドラの動作が残りのスタックに収まることを確認してください。 printfを使ってログファイルを書くことはOKですが、ネットワークライブラリを使っているスタックはあなたのコントロール下にありません。
関連する問題