問題タブ [waitpid]
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 - メインプログラムで「wait()」セットアップを呼び出す「SIGCHLD」ハンドラーを使用して、プラグインで「waitpid()」を安全に実行する方法
いくつかのサブプロセスを実行し、その出力を読み取る必要があるツールキットのモジュールを作成しています。ただし、ツールキットを使用するメイン プログラムは、いくつかのサブ プロセスを生成し、ゾンビ プロセスを取り除くためのSIGCHLD
呼び出しを行うシグナル ハンドラを設定することもあります。wait(NULL)
その結果、作成したサブプロセスが my 内で終了waitpid()
すると、シグナル ハンドラが呼び出される前に子プロセスが処理されるため、wait()
シグナル ハンドラ内の は次のプロセスが終了するまで待機します (これには永遠にかかる可能性があります)。Linux の実装ではファミリwait()
がSIGCHLD
. 私は試してみましpopen()
たposix_spawn()
両方とも同じ問題を抱えています。また、直接の子がすぐに存在するように double を使用しようとしましたが、受信後に呼び出されるfork()
ことはまだ保証できません。waitpid()
SIGCHLD
私の質問は、プログラムの他の部分が呼び出すシグナルハンドラーをセットアップする場合wait()
(おそらく呼び出す必要がありますが、それは私が制御できるものではありません)、ハンドラーwaidpid
を上書きせずに子プロセスを安全に実行する方法はありますか(SIGCHLD
一部のプログラムでは便利です)またはゾンビプロセス。
問題を示す小さなプログラムは次のとおりです (メイン プログラムは、waitpid() で直接待機している短いプログラムではなく、長期的な子プログラムの終了後にのみ終了することに注意してください):
c - waitpid は pid=0 と WIFEXITED=1 を返します pid を取得する方法は?
手順:
別のプログラム グループでプロセスを fork して開始
SIGTSTP でプロセスを停止
SIGCONT でプロセスを再開 プロセス
が終了
問題: SIGCHLD ハンドラーには次のものがあります。
pid=0 と WIFEXITED=1 を返すと、プロセスは終了しましたが、pid を取得できませんか? ピッドが必要です。
マニュアルページより: 「WNOHANG が指定され、pid で指定された 1 つ以上の子 (ren) が存在するが、まだ状態が変更されていない場合、0 が返されます」
しかし、ステータスは exited に変更されたようです。
c++ - waitpid が待っているようには見えない
簡単な関数があります。その目的は、ファイルを上書きする前に .old にコピーすることです。私は怠け者なので(そしてここでの回答がそれを示唆しています)、フォークしてcpを使用して作業を行います。
次に、waitpid を呼び出してリターン コードを確認します。
これを呼び出すコードは私のコピー関数を呼び出し、すぐに読み取り用にファイルを開きます。どういうわけか、呼び出し元のコードが cp 呼び出しの前に実行されているようです - 新しいファイルがコピーされます。最良の例は、ファイルもバックアップも存在しない場合です。どちらも作成され、保存呼び出しの出力が含まれています。
どこが間違っているのかわかりません。助けていただければ幸いです。
c - _exit()、fork()、および waitpid() システム コール
そのため、子スレッドを終了して親スレッドに戻ります。_exit() システム コールを使用しています。私はいくつかのことを疑問に思っていました。1 つは、私の子供の _exit のパラメータです。私の子プロセスが実行しているコードは次のとおりです。
status を使用するのは、親スレッドに戻って waitpid() システム コールで使用するためです。子が完了した後に実行される親プロセスのコードを次に示します。
ここでは、子が終了したことを確認する waitpid() システム コールを使用してから、status を使用して適切に終了したかどうかを確認しています。子を作成して終了する正しい方法でこれを行っているかどうか疑問に思っていました。
次に、親の子の終了を正しくチェックしているかどうかも疑問に思っていました。
ご協力いただきありがとうございます!
c - C: waitpid とコマンド ライン入力を使用した「実行」コマンド
コードの一部として、ユーザーが入力できる関数を作成しようとしています
ユーザーが「実行日」と入力するだけで、プログラムは下の 2 行を表示します。これは、これまでのところ私の機能にあるものです..
これはまだ作成されていませんが、これが今のところ正しいかどうか、重要な部分が欠けているかどうかを知りたいと思っていました! ありがとうございました。
c - cat/waitpid での Segfault (Execve in C)
友達と私はシェルをコーディングしようとしています。私の問題は、「cat」コマンドを実行してから ^C で STDIN を終了すると、プログラムが waitpid で segfault になり、プログラムを終了することです... (もちろん、したくないことです!)
すべてのコマンドは完全に機能しており、他に問題はありません...これらの(大きな)問題を解決する方法について尋ねているだけです。
助けてくれてありがとう!すぐ下のコマンドを実行するための私のコードを参照してください。
私は答えを得ました、ありがとう:)。