問題タブ [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.
linux - GNU Parallel を使用する Bash スクリプトで SIGCHLD エラーを回避する方法
script.sh をループで実行しています。スクリプトには、並列 wget コマンドが含まれています。次のエラーが表示されます。
ループは次のようになります。
エラーの原因となっている行は次のようになります (オプションと設定を省略しています)。
リサーチ:
私は GNU Parallel の専門家ではありませんが、上記のエラーが発生した場合を除いて、ほとんどの場合、スクリプトは問題なく動作しているようです。SIGCHLD を調べているうちに、並列実行を実行すると「ゾンビ プロセス」が作成される可能性があり、場合によってはこれらのプロセスを「刈り取る」必要があることがわかりました。また、プロセスが利用可能なすべての接続を占有する場合があるため、プロセスを強制終了できることもわかりました。
理解しようとしている:
ただし、そもそも何が問題を引き起こしているのかわかりません。それは私のパラレルですか?私はプロセスを「刈り取り」していませんか?プロセスを明示的に強制終了する必要がありますか? 並列スクリプトをループで実行しているためですか?
私の質問:
SIGCHLD エラーを解決するにはどうすればよいですか?
これについての経験があれば、あなたの洞察は大歓迎です。
linux - 実行時に子プロセスの終了シグナルを変更する
プロセスを fork するために使用clone()
すると、子プロセスが "normal" ではなく親に送信するシグナルを指定できますSIGCHLD
。
子が作成された後に設定終了シグナルを変更することは可能ですか? 子供か親のどちらか?
c - バックグラウンド プロセスのシグナル処理
シンプルな Unix シェルを C で実装しようとしていますが、sigaction を使用してバックグラウンド処理機能を実装できませんでした。私のコード構造は次のようなものです:
また、私の execCommand 関数では、構造は次のようになります。
私のハンドラーは次のようなものです:
しかし、この構造は私の実装全体に害を及ぼします。フォアグラウンド プロセスでさえ機能していません。フォアグラウンド コマンドを実行すると、次のようになります。
バックグラウンド コマンドを実行すると、次のようになります。
では、どうすればこの問題を解決できますか?
前もって感謝します...
編集: valgrind でコードをデバッグすると、次のようになります。
c - sigchld_handler 内の pid の pgid() を取得できません
私が開発しているシェルでは、A | B | C
子をフォークしてパイプ内の各子を実行することにより、一連のコマンドを実行します。3 つの子はすべて、最初の子と同じ PGID を持っています。つまり、PID x、y、z を持つ 3 つの子は、PGID = x を持ちます。3 つのコマンドすべての実行は完全に実行されます。SIGCHLD シグナル ハンドラーsigchld_handler()
で、終了した子の数をカウントするのを待ち、それが 3 になると、PGID を取得して、ジョブ データを から削除しJobList
ます。ただし、この関数は3 つの PID すべてに対してgetpgid()
戻ります。つまり、すべてerrno 3 (ESRCH) で返されます。-1
x, y, z
getpgid(x), getpgid(y), getpgid(z)
-1
setpgid()
親プロセスで使用している子に pgid を設定している間、完全に正常に機能しgetpgid()
、x が返されました。この問題は、シグナル ハンドラでのみ発生します。シグナル ハンドラでpgid
を取得する方法を教えてください。pid
シグナル ハンドラのコードは次のとおりです。
、main()
親プロセスで、私がした後:
どんな助けでも大歓迎です。
ありがとう。
c - SIGCHLD シグナルのハンドラー
コードが機能せず、ループします。エラーは、SIGCHLD シグナルのハンドラーである gestore メソッドにあると思います。ハンドラーを使用して SIGCHLD シグナルをキャプチャするのはこれが初めてです。このプログラムは、数字が argv[1] 回出現するまで、0 から argv[1] までをさりげなく抽出し続けます。明確でない場合は、質問の最後に置いた私の古いプログラムをテストできます。エラーを見つけるのを手伝ってもらえますか?
私の目標は、古いプログラム (動作する) を変更して、子の終了ステータスを取得する方法を変更することでした。「待機」との同期から、SIGCHLD シグナルを処理する gestore メソッドとの非同期まで。これは私の古いプログラムです:
//throw-dice.c