問題タブ [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 - 子プロセスはabort()でSIGCHLDを送信しますか?
アプリケーションがを実行し、子が(に失敗したために)でfork()
死亡した場合、親プロセスは?を受け取りますか?abort()
assert()
SIGCHLD
関連する場合、これはDebian 4(gccバージョン4.1.2)にあります。
arrays - シグナルハンドラ関数で main:: から配列を更新する (Perl)
フォークした子の pidlist 配列を維持し、終了時にそれらを削除したいと思います (任意の時点でフォークされたプロセスの数を制限するため)。@main::pid_list を delete または splice のいずれかで使用することでこれを行うことができると思いましたが、喜びはありませんでした。要素を正常にポップできますが、明らかに正しい pid を削除することはできません。これを処理する方法はありますか、それともまったく別の方法でこれを行う方がよいでしょうか?
bash - トラップSIGCHLDを使用してbashサブプロセスを再起動しますか?
「ps」または「サービスステータス(Linuxの場合)」を使用してプロセスステータスを定期的にチェックするスクリプト、またはフォークしてプロセスを待機するC / C ++で監視プログラムを見てきました...
bash を trap で使用して、SIGCLD が受信されたときにサブプロセスを再起動することは可能でしょうか?
次のアイデアでRedHat Linuxで基本的なスイートをテストしました(そして確かに機能しませんでした...)
開始されたbashスクリプトは、数秒間スリープして、今のところ終了します。
いくつかの問題が観察されました:
- シェルがフォアグラウンドで起動すると、SIGCHLD は 1 回だけ処理されます。シグナル()のようなリセットシグナル処理をトラップしますか?
- スクリプトとその子は SIGINT の影響を受けないようです。つまり、^C で停止することはできません。
- 閉じることができないので、端末を閉じました。台本はHUPらしく、ゾンビの子がたくさん出てきました。
- バックグラウンドで実行すると、スクリプトにより端末が停止しました
...とにかく、これはまったく機能しません。私はこのトピックについてほとんど知らないと言わざるを得ません。誰かがいくつかの実例を提案または提供できますか? そのような使用のためのスクリプトはありますか?
では、bashでwaitを使用するのはどうですか?
ありがとう
perl - Net :: SNMP :: Dispatcherが「select()エラー[子プロセスなし]」で失敗するのはなぜですか?
SNMPサービスをポーリングするときに、奇妙な子プロセスエラーの原因を特定して排除するための支援が必要です。
SNMP接続中に、タイムアウトになるまでデバイス名をポーリングしてSNMP接続を確認します。
ほとんどの場合、これは問題なく機能しますが、Net :: SNMP :: Dispatcher:から致命的なエラーが発生する場合があります。
(行857はsnmp_dispatcher
、上記のget_bulkにあります)
私はperlに十分慣れており、SNMPにまったく慣れていないので、これをトラブルシューティングする方法がよくわかりません。問題のメソッドは、問題の切り分けに役立つ場合は、mod_perlCGI呼び出しで実行されます。
c - SIGCHLD を処理するにはどうすればよいですか?
SIGCHLD
適切に処理する必要があります。既存のコードでどのように使用できますか? 0
の代わりに使用しない限り、現時点では子プロセスを待つことができませんWNOHANG|WUNTRACED
。
削除するsleep
と、親が最初に実行されます..なぜですか?
c - Beejのガイドの例を処理するSIGCHLD
これがコードです
SIGCHLDは、子プロセスが終了したときにプロセスに送信される信号であることを知っていますが、子プロセスはどこで作成されますか?!
linux - SIGCHLD がプロセス ツリーに配信されない
子が死亡した場合、親がプロセスとそれに依存するプロセスを再起動するように、他のプロセスを管理するプロセスを作成しようとしています。
問題は、この構造の途中でプロセスを再起動するときにプロセスのツリー構造を作成すると、新しい子プロセスが終了したときに通知されないことに気付くことです。
例を書きます。祖父母、親、子の 3 つのプロセスがあるとします。祖父母がフォークして親を開始し、そのフォークして子を開始します (コードはこの投稿の最後に置きます)。子をすべて正常に終了させると、子は正しく再起動されます。
親を殺すと問題が発生します...祖父母は子を再起動する親を再起動しますが、子を殺すとプロセスはゾンビ状態のままになり、SIGCHLDは親プロセスに配信されません。
言い換えると:
- 祖父母プロセスを開始し、3 つのプロセスすべてが起動するのを待ちます
- 親プロセスを強制終了し、祖父母が親を再起動して子を再起動するのを待ちます
- 子プロセスを強制終了すると、プロセスはゾンビ状態のままになります。
私はこの動作を理解できません...シグナルと待機に関する例とドキュメントをたくさん読みました。親と祖父母のフォークの前にデフォルトハンドラーをリセットしようとしましたが、何も機能していないようです...ここにコードサンプル...
祖父母.cpp
親.cpp
子.cpp
perl - さまざまな $SIG{CHLD} 値の違いは何ですか?
これらの設定の違いは何ですか?
「UNIX環境での高度なプログラミング 第2版」によると、図10.1のSIGCHLDのデフォルト値は「無視」です。
「無視」が「SIG_IGN」を意味する場合、子供はゾンビになることはなく、そうではありません。
そこからはあまり明確になりません。
プロセスがその性質を明確に SIG_IGN に設定した場合、呼び出しプロセスの子はゾンビ プロセスを生成しません。これは、デフォルトのアクション (SIG_DFL) とは異なることに注意してください。図 10.1 では無視されます。代わりに、終了時に、これらの子プロセスのステータスは破棄されます。
さまざまな値(または未定義の非値)の影響が何であるかを理解するのに苦労しています。これまでの解決策は、目的の動作が得られるまでこれらの選択肢を繰り返し使用することでしたが、各値が信号の動作をどのように定義するかを正確に理解したいと考えています。
動作: 子プロセスが「システム」を呼び出しているか、別の子を作成するバックティックを使用しており、シグナルは通常、間違った (親) ハンドラーによってキャッチされます。ローカル ハンドラーを設定することはできますが、孫からのシグナルで何もしないようにする場合、どの値が最も適切かわかりません。
誰か私を照らしてくれませんか?
更新: ikegami のフィードバックに基づいて、特定のテストを行いました。この動作は、少なくとも部分的にはプラットフォーム固有です。
次のフラグメントを検討してください。
Solaris 10 上の Perl 5.8.6 は、system() 呼び出しの PID に対して「SIGNAL CHLD」メッセージを表示します。些細なことでも何でもする
ローカル $SIG{CHLD};
子でそれらのメッセージを抑制します。
私が試した他のすべてのフレーバーでは、死神は子供を見ることはありません.
wait - SIGCHLD ハンドラの再インストール
次のような SIGCHLD ハンドラの例がいくつかあります。
ハンドラーには、私を混乱させる 2 つの部分があります。1)。SIGCHLD は、子プロセスが終了または停止したときにキャッチされます。それでは、なぜハンドラー内で待機を呼び出す必要があるのでしょうか? 信号はすでに到着しています。2)。SIGCHLD ハンドラを再インストールする必要があるのはなぜですか。シグナル呼び出しはハンドラーを一度だけインストールしませんか?
ありがとう!
c - 未刈り児とその未来
そのため、子が死ぬと親は get を取得しますSIGCHLD
が、親が wait() を実行する前に死ぬと、子の親は に変更されinit
ます。この時点で、子はzombie
ie<defunct>
です。
次は何が起こる?
その子に wait() を実行しますかinit
? はいの場合、いつそれを行いますか? 制限時間に関する保証はありますか?