問題タブ [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.

0 投票する
1 に答える
3655 参照

c - ハンドラーのシグナルをブロックする

各シグナル (SIGCHLD、SIGTSTP、SIGINT) のハンドラーを設定しましたが、いくつかのハンドラーの実行中に他のシグナルをブロックする必要があります。sigaction(2)Blocking for Handler
など のリソースがありますが、自分の状況で何をすべきか、コードの使用方法がわかりませんでした。 少しの情報: handlers: sigchldHandler, sigintHandler, sigtstpHander => signal.c smash.c というファイルがあり、常にコマンドを取得するための無限ループが含まれています。 前もって感謝します



0 投票する
2 に答える
6588 参照

c - linux - 子プロセスによって中断された親プロセスのsleep()

子プロセスが実行されるとfork()、親プロセスwait()は子プロセスを完了することができます。試しにwait()、親プロセスを作るのでsleep()はなく、なぜそれが機能しないとしますか?

SIGCHLDシグナルが親プロセスを から復帰させていると思いsleep()ます。しかし、なぜ、それは子プロセスであり、異なるアドレス空間とリソースを持っているのに、どうして親プロセスの問題に干渉できるのでしょうか?

0 投票する
1 に答える
457 参照

c - FreeBSD と C 言語で終了後に子プロセスの PID を取得する

SIGCHLD を適切に処理しようとしていますが、ハンドラー内のプロセスの PID を取得できないため、構造内の 1 つのパラメーターの値を変更できます。

コードは次のとおりです。

ハンドラーのコードは次のとおりです。このファイル内には、dead_child_pidという名前のグローバル変数があり、変更に使用する死んだ子の pid を格納したいと考えています。

handler_SIGCHLD が呼び出され、最後に mark_unused=1 を設定すると、次のコードがアクセスされます。

0 投票する
1 に答える
1255 参照

linux - メインプログラムで「wait()」セットアップを呼び出す「SIGCHLD」ハンドラーを使用して、プラグインで「waitpid()」を安全に実行する方法

いくつかのサブプロセスを実行し、その出力を読み取る必要があるツールキットのモジュールを作成しています。ただし、ツールキットを使用するメイン プログラムは、いくつかのサブ プロセスを生成し、ゾンビ プロセスを取り除くためのSIGCHLD呼び出しを行うシグナル ハンドラを設定することもあります。wait(NULL)その結果、作成したサブプロセスが my 内で終了waitpid()すると、シグナル ハンドラが呼び出される前に子プロセスが処理されるため、wait()シグナル ハンドラ内の は次のプロセスが終了するまで待機します (これには永遠にかかる可能性があります)。Linux の実装ではファミリwait()SIGCHLD. 私は試してみましpopen()posix_spawn()両方とも同じ問題を抱えています。また、直接の子がすぐに存在するように double を使用しようとしましたが、受信後に呼び出されるfork()ことはまだ保証できません。waitpid()SIGCHLD

私の質問は、プログラムの他の部分が呼び出すシグナルハンドラーをセットアップする場合wait()(おそらく呼び出す必要がありますが、それは私が制御できるものではありません)、ハンドラーwaidpidを上書きせずに子プロセスを安全に実行する方法はありますか(SIGCHLD一部のプログラムでは便利です)またはゾンビプロセス。

問題を示す小さなプログラムは次のとおりです (メイン プログラムは、waitpid() で直接待機している短いプログラムではなく、長期的な子プログラムの終了後にのみ終了することに注意してください):

0 投票する
2 に答える
578 参照

perl - 特定の子のみが SIGCHLD をトリガーするのを防ぐ方法はありますか?

私はデバッグユーティリティforkを書いていますが、その子の終了SIGCHLDがその親にトリガーされるのを防ぎながら、子にしたいです。私はまだ、他の子供たちがSIGCHLD終了時に通常どおりに発生することを望んでいます。

fork既存のハンドラーをトリガーしたくないのでこれを行いたいのです$SIG{CHLD}が、それでも他の子にそれをトリガーさせたいのです。つまり、新しい子を隔離したいのですが、既存の子の管理に干渉したくありません。

$SIG{CHLD}元のハンドラーをいつ呼び出す必要があるかを適切に検出できるとは思わないため、カスタムハンドラーをローカルにインストールすることには慎重です。たとえば、ローカル$SIG{CHLD}ハンドラーをインストールするSIGCHLDと、子をスポーンして親waitpidを終了させると、必ずシグナルを受信します。ただし、それSIGCHLDは他の子も終了したかどうかを示すものではないため、元のハンドラーを呼び出すかどうかはわかりません。

プロセスがその親 pid を変更できないことを調査しました。子のプロセス グループ ID またはセッション ID を変更することが役立つかどうかはわかりません。

SIGCHLD特定の子が親でトリガーするのを防ぐことさえ可能ですか? 既存のハンドラーが予期していなかった子$SIG{CHLD}のシグナルを受信したときに、正しいことを実行することに依存する必要がありますか?SIGCHLD

そのデバッグ ユーティリティを実装するためのより良い方法があるかもしれませんが (ある場合はお知らせください)、POSIX が子に対するそのようなきめ細かな制御を提供するかどうかはまだ疑問に思っており、私のジレンマに対する Perl ソリューションを探しています。