問題タブ [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 投票する
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 ソリューションを探しています。

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

c - C - どのような状況で、waitpid() の呼び出しが -1 を返し、エラーを通知しますか?

私は SIGCHLD ハンドラーを作成していますが、waitpid() を呼び出すとどのような条件で -1 が返されるのでしょうか?

より具体的には、waitpid(...) を呼び出すループを作成し、終了したすべての子プロセスが取得されるまでループを実行したい場合、waitpid(...) が -1 を返すまで繰り返しますか? そうでなければ、刈り取りが必要な子供が他にいるかどうかをどうやって知ることができますか?

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

c - 死んだ子プロセスの PID を取得して親で使用するにはどうすればよいですか?

ループ内に 4 つの子プロセスを作成する C プログラム (FreeBSD、Unix 用) を作成しようとしています。それぞれの子供は何かをし、死ぬとすぐに他の子供に取って代わられます。というわけで、4人の子供がずっと働いています。

各子 PID をテーブルに登録する必要があり、それらが終了した後、テーブルの PID を削除する必要があります。これは私が問題を抱えている部分です。

したがって、最初の試行では、死んだ子の PID をグローバル変数に送信するハンドラーを作成しようとしました。

次に、親でそれを使用して、死んだ子の PID をテーブルから削除します。しかし、2 人の子供が同時に死亡した場合、PID の 1 つが別の PID によって上書きされることに気付きました。

どうすればこの状況を回避できますか?

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

c - SIGHLD の処理方法

sigchld の使用に問題があります...

私がやりたいのは、フォークで子プロセスを作成し、子プロセスを印刷して数回スリープさせることです...これらのプロセス中に、子プロセスにシグナルを送信し(SIGSTOPおよびSIGCONTINUED)、親が必要です信号が何であったかを出力するには...ここに私のコードがあります:

しかし、SIGSTOPまたはSIGCONTINUEDを子に送信すると、子は停止して続行しますが、親は何も出力しないため、機能しません

なにか提案を?

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

linux - Linux で SIGCHLD、EINT、および accept() を処理する適切な方法

TCP サーバーを作成するプログラムがあります。accept() がクライアントに接続すると、それを fork() して接続を処理します。そのクライアントが離れると、SIGCHLD のために waitpid() が呼び出されますが、accept() で EINTR が発生します。私の質問は、これをどのように処理する必要があるかです。私は非常に多くの異なる方法を読みました。

ほとんどの人は、EINT を無視して、accept() を再試行すると言います。ちょうどそれを行うマクロを見たことがあります: TEMP_FAILURE_RETRY()。sigaction フラグ SA_RESTART および SA_NOCLDSTOP を設定すると言う人もいます。私はそれを試しましたが、他のエラーが発生します (errno = ECHILD)。また、子供はどのように終了する必要がありますか?_exit(0) と exit(0) の両方を見てきました。

SIGCHLD の処理は次のとおりです。

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

c - 一般的に SIGCHLD を無視する理由

私はシグナルについて勉強していて、このリンクをたどっていました

https://en.wikipedia.org/wiki/Child_process#cite_note-1

そして、これはそれが言うことです:

SIGCHLD を無視する理由はありますか。

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

c - システム コールによって中断された Waitpid

を使用してコマンドを実行する子プロセスをフォークしていexecveます。次のように、SIGCHLD、SIGINT、およびSIGSTPの3つのシグナルハンドラーをインストールして定義しています。

ここで、プロセスを実行してバックグラウンド (ctrl z) でループ (100 回) すると、ほとんどの場合、エラーが発生します。waitpid error: Interrupted system call

なぜ私はこれを手に入れたのですか?

0 投票する
0 に答える
438 参照

c - 単純なシェル プログラムで SIGCHLD がキャッチされた場合の Seg Fault

更新: act.sa_flags = SA_RESTART を設定すると、プログラムは seg faulting を停止しますが、プログラムのロジックを進めないため、プログラムがその関数で「スタック」します。コロンは、新しいコマンド ライン入力の開始を示します。理想的な出力は次のとおりです。

しかし、私は今、次のことを取得しています:

前: バックグラウンド プロセスとフォアグラウンド プロセスを備えた単純なシェルを C でコーディングしようとしています。バックグラウンド プロセスを作成するには、ユーザーはコマンドの最後に「&」を入力する必要があります。たとえば、「sleep 3 &」はバックグラウンドプロセス。私のプログラムでは、「sleep 3 &」と入力するとプロセスは正常に実行されますが、sig ハンドラー関数が呼び出されると完了時にステートメントが出力され (バックグラウンド プロセスが終了したことを示します)、プログラム seg フォールトが発生します。出力の例を次に示します。

: スリープ 3 & バックグラウンド pid は 22688 : バックグラウンド pid 0 が完了しました: シグナル 0 によって終了しました セグメンテーション違反: 11

バックグラウンド プロセスを実行しようとするとシグナル ハンドラが呼び出されますが、その理由がわかりません。SIGINT を使用するように sigaction を設定すると、プログラムはエラーをセグメント化しません。何かご意見は?ここで同様の投稿を見ました ( SIGCHLD はセグメンテーション違反を引き起こし、ハンドラーには入りません ) が、役に立ちませんでした。

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

bash - BASH スクリプトが完了する前に終了する

この時点に到達するために多くのことを行う長いbashスクリプトがあります...

(ケースステートメントの最後に)...

この時点で、標準出力への出力なしで単純に終了します。strace -f で実行しました。関連する結果は次のとおりです。

この文字列 ' read(255, "exit 0... ' が原因であるかどうかはわかりません。また、なぜ突然終了するのかを確認することもできません。先に進み、終了する前に解凍操作を短時間実行しようとします。誰でもどんなアイデアでも大歓迎です。

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

linux - GNU Parallel を使用する Bash スクリプトで SIGCHLD エラーを回避する方法

script.sh をループで実行しています。スクリプトには、並列 wget コマンドが含まれています。次のエラーが表示されます。

ループは次のようになります。

エラーの原因となっている行は次のようになります (オプションと設定を省略しています)。

リサーチ:

私は GNU Parallel の専門家ではありませんが、上記のエラーが発生した場合を除いて、ほとんどの場合、スクリプトは問題なく動作しているようです。SIGCHLD を調べているうちに、並列実行を実行すると「ゾンビ プロセス」が作成される可能性があり、場合によってはこれらのプロセスを「刈り取る」必要があることがわかりました。また、プロセスが利用可能なすべての接続を占有する場合があるため、プロセスを強制終了できることもわかりました。

理解しようとしている:

ただし、そもそも何が問題を引き起こしているのかわかりません。それは私のパラレルですか?私はプロセスを「刈り取り」していませんか?プロセスを明示的に強制終了する必要がありますか? 並列スクリプトをループで実行しているためですか?

私の質問:

SIGCHLD エラーを解決するにはどうすればよいですか?

これについての経験があれば、あなたの洞察は大歓迎です。