問題タブ [signal-handling]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - セグメンテーション違反の処理
セグメンテーション違反またはctrl-cをキャッチするために使用するアプリケーションがあります。以下のコードを使用すると、セグメンテーション違反をキャッチできますが、ハンドラーが何度も呼び出されています。どうすればそれらを止めることができますか。参考までに、アプリケーションを終了したくありません。破損したバッファをすべて解放するように注意することができます。
出来ますか?
ハンドラーは次のようになります。
ここでセグメンテーション障害シグナルの場合、ハンドラーが複数回呼び出されており、明らかなように、 MyfreeBuffers() は既に解放されたメモリを解放するためのエラーを返します。一度だけ解放したいのですが、それでもアプリケーションを終了したくありません。
助けてください。
c - ctrl-c のシグナル ハンドラーを使用する - 無限ループのヘルプが必要
ctrl-c シグナルにシグナルハンドラーを使用しています。つまり、アプリケーションを終了する代わりに ctrl-c シグナルが生成されるたびに、何らかのアクションを実行します。
while(1) ループ (何らかのエラー状態) が原因でアプリケーションがハングした場合、その場合にのみアプリケーションを終了できるとしますか?
元:
ありがとう
android - ネイティブ コードから Android アクティビティ スタックを取得することはできますか?
標準のトゥームストーン ファイルよりも詳細なログを生成するネイティブ シグナル ハンドラーを実装しています。バグの診断に役立つように、現在のタスクのアクティビティ スタックのダンプを含めたいと思います。
1 つの方法は、JNI を使用して Java コードからアクティビティ マネージャーを取得することです。これは機能しますが、シグナル ハンドラ内から呼び出された場合の安全性は保証されません。
私の質問は、ネイティブ コードからアクティビティ スタックに関する情報を取得することは可能ですか?
perl - シグナルハンドラから共有データ構造に安全にアクセスできます
のために構築されたperl(v5.14.2)のシグナルハンドラーから共通の(ハンドラーコードと残りのプログラム間で共有される)データ構造にアクセスしても安全かどうかを判断しようとしていますx86_64-linux-thread-multi
が、ターゲットプラットフォームはsolaris11)です。
perlipcには次のサンプルコードがあります。
したがって、%children
whileループとハンドラーからアクセスされます。これは問題ないようです:
- 同じものを持つ2つのプロセスはありません
pid
- アクセスは次のように調整されます(ただし、破損を引き起こすことなくアトミックで割り込み可能
pid
かどうかはわかりません)。$childer{pid}=1
今、私は私のハンドラーでさらに多くのことをしようとしています:
ここでの考え方は、すべての子が特定のカテゴリ(Nから1)に属しているということです。カテゴリごとに何人の子供が存在するかを追跡したいと思います。その情報はから導き出すことができますが$categoryForPid
、それも問題になる可能性があると思います(たとえば、計算を実行しているサブルーチンが合計中に中断された場合)。
だから私の質問は:
- どういうわけかここで同期する必要がありますか?
ちなみに:
- シグナルハンドラのネストされた呼び出しはperl5.12で可能ですか、それともインタプリタによって線形化されていますか?
アップデート
@goldilocksと彼が提案した解決策によって発見された問題に加えて、「原子性」を確保するためにデータ構造を更新している間、信号をブロックします。
c++ - ライブラリの子プロセスのプロセス グループ
私は、クライアント コードに統合されるライブラリ (C++) に取り組んでいます。この lib はいくつかの子プロセスを生成し、(何らかの理由で) 死ぬとすぐにそれらを再生成するためにそれらを監視する必要があります。これらの子プロセスを生成するには、vfork と exec を使用する必要があります。
シグナル ハンドラーを使用して SIGCHLD を処理し、waitpid を呼び出して、どの子が死んでいるかを検出する必要があることはわかっています。ただし、ユーザー コードは同じ考え方を使用して、独自の子プロセスを処理している可能性があります。
waitpid を呼び出すと、停止した可能性のあるすべての子プロセスに関する情報が取得されます (私のものかどうかに関係なく)。死にゆくプロセスが私のものなら、問題ありません... 幸せなケースです。ただし、それがユーザーからのものである場合、既に waitpid を呼び出しているため、ユーザーはそれに関する情報を取得していません。
どうすればそれを回避できますか?
私の最初のアイデアは、プロセス グループを使用することです。初めて fork すると、子 pid を取得して、プロセス グループ ID として保存します。私が作成する各子は、そのグループをこの pid に設定します。皆さん、それは良い選択だと思いますか? (私はそれに問題があります)。
私の 2 番目のアイデアは、シグナル ハンドラーを元のハンドラーにリセットする (または単に呼び出す) ことです。シグナルを再発生させると、元のハンドラーがそれを取得できるようになります。その後、シグナルハンドラを再インストールする必要があります。それは良い選択でしょうか?
3 つ目の選択肢は、INFO (拡張シグナル ハンドラー) を使用することです。瀕死のプロセスの pid は info 構造体で利用できると思います。これが私の子供の 1 人なら、そのために waitpid を呼び出しますが、それで問題ありません。それが私のものでない場合は、元のシグナルハンドラーを呼び出します。それは良い選択でしょうか?
最後に 1 つだけ補足質問をします。元のシグナル ハンドラーを呼び出せるようにするには、常にそれらを復元してシグナルを再生成する必要がありますか、それとも関数呼び出しとして呼び出すだけで十分ですか?
どうもありがとうございました。
java - Java でシグナル/イベントを処理する方法
Javaでシグナルがどのように処理されるか教えてもらえますか? アプリケーション main () からスレッドにイベント/シグナルを通知する必要がある状況があります。
unix - sigaction によるシグナル処理
このコードとコメントに出くわしたとき、pselect システムコールの使用について読んでいました...
今、私はsigactionシステムコールについて確信が持てません...最初は、シグナルに対応するハンドラーを保存するようなものだと思っていました...シグナルが到着すると、そのハンドラーを探し、ハンドラーが実行されます...しかし、それが正しい場合、シグナルに対応するハンドラーはプログラム全体で保存され、シグナルが到着するたびに実行されます... sigaction と select の間の期間が短くても、シグナルは処理されます...
しかし、このコードは、信号がsigactionの呼び出し/実行と一致した場合にのみ処理されるように思わせます...呼び出しが完了した後、信号はプログラムの残りのsigactionによって設定されたハンドラーによって処理されません(私は知っています) 、ばかげているように聞こえます)
説明してください!!
java - ネイティブ コードで生成された SEGFAULT を処理することは可能ですか?
インターフェイスとして提供される JNI クラスを介して、サードパーティのネイティブ モジュールにアクセスする Java 1.6 アプリケーションがあります。最近、ネイティブ モジュールで SEGFAULT が発生し、アプリケーションがクラッシュしていることに気付きました。少なくとも死ぬ前に適切にログに記録するために、このイベントをキャッチして処理することは可能ですか?
kjp's answerの記事で両方の Java 手法を試しました。どちらも機能しませんでした。「SEGV」にシグナル ハンドラをインストールしようとすると、例外が発生する
VM で既に使用されている信号: SEGV
私がインストールしたシャットダウン ハンドラーは、おそらくIBM の記事に次のように記載されているため、起動に失敗しました。
次の場合、シャットダウン フックは実行されません。
JVM を終了するために、Runtime.halt() メソッドが呼び出されます。Runtime.halt() は、JVM の迅速なシャットダウンを可能にするために提供されています。
-Xrs JVM オプションが指定されています。
JVM ソフトウェアによって生成された例外条件または強制アボートなど、JVM が異常終了します。
windows - Autosys:KILLJOBイベントが孤立したプロセスを残す
Windowsサーバーでさまざまなプロセスを実行しています(バッチファイル、Java、Perl、CSharpスクリプト/アプリケーションの組み合わせ)。これらのプロセスは、Autosysを使用して起動されます。Windowsのautosysエージェントは、ジョブ定義で指定したコマンドの前に常に「cmd / c」を付けます(以下の例を参照)。
これ自体は問題ではありませんが、autosys KILLJOBイベントを送信してジョブを強制終了しようとすると(Autosysのドキュメントに従って、プロセスに割り込みとそれに続く強制終了シグナルが送信されます)、foobar.exeは強制終了されません。強制終了される親cmd.exe。foobar.exeは孤立したプロセスとして終了し、タスクマネージャーを使用してサーバーを手動で終了するには、サーバーにログインする必要があります。
autosysからの終了シグナルが実際のプロセスに伝播するようにするための解決策はありますか?
ありがとう。
c - 処理する最も重要な信号は?
最近、私は c で書かれた約 3 ~ 4,000 行のコードを持つソフトウェアに取り組んでいました。セグメンテーション違反が発生し始めたとき、SIGSEGV ハンドラーを追加しました。バックトレースを与える。
私の質問は、SIGSEGV とは別に、エラー検出が容易になるように、大きなソフトウェアがある場合に処理すべき重要なシグナルは何かということです。
これは、オプションで攻撃を防ぐために使用できます。例 重要な更新/操作を行っているときにアボート信号を受信するソフトウェア。標準では、SIGHUP、SIGINT、SIGKILL、SIGPIPE、SIGTERM およびその他のいくつかの信号には、この信号が配信されたプロセスを終了するデフォルトのプロパティがあることが示されています。
したがって、ソフトウェアに別の保護層を追加するには、これらの信号の動作を変更する必要があります。保護とは、重要な更新の間にソフトウェアが終了しないようにすることを意味します。いつ終了するかを決定しますアボート。
編集:ソフトウェアがどのようにうまく設計されているか、シグナルを処理し、ソフトウェアが構築されているときに役立つセーフティネットのように使用することを知りたいです。