問題タブ [sigchld]
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 - ハンドラーのシグナルをブロックする
各シグナル (SIGCHLD、SIGTSTP、SIGINT) のハンドラーを設定しましたが、いくつかのハンドラーの実行中に他のシグナルをブロックする必要があります。sigaction(2)やBlocking for Handler
など
のリソースがありますが、自分の状況で何をすべきか、コードの使用方法がわかりませんでした。
少しの情報:
handlers: sigchldHandler, sigintHandler, sigtstpHander => signal.c smash.c
というファイルがあり、常にコマンドを取得するための無限ループが含まれています。
前もって感謝します
c - linux - 子プロセスによって中断された親プロセスのsleep()
子プロセスが実行されるとfork()
、親プロセスwait()
は子プロセスを完了することができます。試しにwait()
、親プロセスを作るのでsleep()
はなく、なぜそれが機能しないとしますか?
SIGCHLD
シグナルが親プロセスを から復帰させていると思いsleep()
ます。しかし、なぜ、それは子プロセスであり、異なるアドレス空間とリソースを持っているのに、どうして親プロセスの問題に干渉できるのでしょうか?
c - FreeBSD と C 言語で終了後に子プロセスの PID を取得する
SIGCHLD を適切に処理しようとしていますが、ハンドラー内のプロセスの PID を取得できないため、構造内の 1 つのパラメーターの値を変更できます。
コードは次のとおりです。
ハンドラーのコードは次のとおりです。このファイル内には、dead_child_pidという名前のグローバル変数があり、変更に使用する死んだ子の pid を格納したいと考えています。
handler_SIGCHLD が呼び出され、最後に mark_unused=1 を設定すると、次のコードがアクセスされます。
linux - メインプログラムで「wait()」セットアップを呼び出す「SIGCHLD」ハンドラーを使用して、プラグインで「waitpid()」を安全に実行する方法
いくつかのサブプロセスを実行し、その出力を読み取る必要があるツールキットのモジュールを作成しています。ただし、ツールキットを使用するメイン プログラムは、いくつかのサブ プロセスを生成し、ゾンビ プロセスを取り除くためのSIGCHLD
呼び出しを行うシグナル ハンドラを設定することもあります。wait(NULL)
その結果、作成したサブプロセスが my 内で終了waitpid()
すると、シグナル ハンドラが呼び出される前に子プロセスが処理されるため、wait()
シグナル ハンドラ内の は次のプロセスが終了するまで待機します (これには永遠にかかる可能性があります)。Linux の実装ではファミリwait()
がSIGCHLD
. 私は試してみましpopen()
たposix_spawn()
両方とも同じ問題を抱えています。また、直接の子がすぐに存在するように double を使用しようとしましたが、受信後に呼び出されるfork()
ことはまだ保証できません。waitpid()
SIGCHLD
私の質問は、プログラムの他の部分が呼び出すシグナルハンドラーをセットアップする場合wait()
(おそらく呼び出す必要がありますが、それは私が制御できるものではありません)、ハンドラーwaidpid
を上書きせずに子プロセスを安全に実行する方法はありますか(SIGCHLD
一部のプログラムでは便利です)またはゾンビプロセス。
問題を示す小さなプログラムは次のとおりです (メイン プログラムは、waitpid() で直接待機している短いプログラムではなく、長期的な子プログラムの終了後にのみ終了することに注意してください):
perl - 特定の子のみが SIGCHLD をトリガーするのを防ぐ方法はありますか?
私はデバッグユーティリティfork
を書いていますが、その子の終了SIGCHLD
がその親にトリガーされるのを防ぎながら、子にしたいです。私はまだ、他の子供たちがSIGCHLD
終了時に通常どおりに発生することを望んでいます。
fork
既存のハンドラーをトリガーしたくないのでこれを行いたいのです$SIG{CHLD}
が、それでも他の子にそれをトリガーさせたいのです。つまり、新しい子を隔離したいのですが、既存の子の管理に干渉したくありません。
$SIG{CHLD}
元のハンドラーをいつ呼び出す必要があるかを適切に検出できるとは思わないため、カスタムハンドラーをローカルにインストールすることには慎重です。たとえば、ローカル$SIG{CHLD}
ハンドラーをインストールするSIGCHLD
と、子をスポーンして親waitpid
を終了させると、必ずシグナルを受信します。ただし、それSIGCHLD
は他の子も終了したかどうかを示すものではないため、元のハンドラーを呼び出すかどうかはわかりません。
プロセスがその親 pid を変更できないことを調査しました。子のプロセス グループ ID またはセッション ID を変更することが役立つかどうかはわかりません。
SIGCHLD
特定の子が親でトリガーするのを防ぐことさえ可能ですか? 既存のハンドラーが予期していなかった子$SIG{CHLD}
のシグナルを受信したときに、正しいことを実行することに依存する必要がありますか?SIGCHLD
そのデバッグ ユーティリティを実装するためのより良い方法があるかもしれませんが (ある場合はお知らせください)、POSIX が子に対するそのようなきめ細かな制御を提供するかどうかはまだ疑問に思っており、私のジレンマに対する Perl ソリューションを探しています。