問題タブ [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.
unix - UNIX プロセス: fork() および wait()
これは私の質問でfork()
あり、それぞれwait()
が行われます:
私のでは、システムコールを使用main()
する関数を呼び出しますが、子が終了するのを待たずに戻りたいため、終了する前にそれらを待つ必要があります。function()
fork()
function()
main()
それで、my this と呼ばれる別の関数の本体で編集された子main()
を呼び出すことは可能ですか?wait()
fork()
main()
main()
はいの場合、変数を介して子供の pid を渡す必要がありますか?
c++ - 問題を作成するC++のWaitpid
私は与えられたようにwaitpidを使用しています
waitpid(childPID、&status、WNOHANG);
これは、必要に応じてフォークし、親が子プロセスが戻るのを待つ無限ループ内のプログラムで使用されます。しかし最近、これをcerrに出力した後にプログラムが終了するという問題に遭遇しました。
waitpid:子プロセスはありません
これは常に、プログラムがクラッシュ/終了する前のプログラムからの最後のログです。プログラムがアクセスした最後の10個のアドレスを出力するトレースバック関数が記述されているため、セグメンテーション違反などが発生しないことはわかっています。それでは、子プロセスがないことを検出した後、プログラムがループを終了したことを意味しますか?それとも、ここで何か不吉なことが働いていますか?
c - Cで子プロセスを実行/一時停止しますか?
C で子プロセスを実行していますが、一時停止してから同じ子プロセスを実行したいと考えています。私はこれが初めてなので、私の問題をより良い方法で説明する方法がよくわかりませんが、ここにショットがあります。
したがって、を使用して、別のプロセスが終了した後にプロセスを実行できることを知っていますwaitpid
。しかし、待機しているプロセスの作成時に、待機しているプロセスが存在しない場合はどうなりますか。したがって、この場合、待機しているプロセスを一時停止し、待機しているプロセスが作成されて終了すると、待機しているプロセスを再度実行するように呼び出すことを考えています。それで、あなたはこれをどのようにしますか?繰り返しますが、私はこれに慣れていないため、これが適切な方法であるかどうかはわかりません。
編集:私がやろうとしていること
子プロセスを使用しexecvp()
て並行してコマンドを実行しているため、 sequence がある場合sleep 1; sleep 1;
、合計スリープ時間は 1 秒になります。ただし、並列化しようとする場合があります。その場合、何とかファイルに入力した後にファイルを読み取るとecho blah > file; cat < file;
想定しています。したがって、私は完了するのを待たなければなりません。これにはさらに具体的な説明がありますが、通常、ファイルへの出力を伴うコマンドは、スクリプトの後半でファイルを読み取るコマンドによって待機する必要があると想定しています。cat
echo
echo
cat
c - ジョブを 2 つのスレッドに分割し、wait、waitpid、fork を使用します
ジョブを 2 つの子プロセスに分割したい。1 つの子が最小値を見つけ、別の子が最大値を見つけます。サンプルコードは次のとおりです。
戻り値は min:0 max:0 になりました。これを見ていただけますか?
linux - Bash: タイムアウトで待機
Bash スクリプトでは、次のようなことをしたいと思います。
つまり、バックグラウンドで 2 つのアプリケーションを起動し、それらの作業が完了するまで 60 秒待ちます。次に、その間隔内に終了しない場合は、それらを殺します。
timeout
残念ながら、は実行可能ファイルであり、wait
はシェル コマンドであるため、上記は機能しません。私はそれを次のように変更しようとしました:
wait
ただし、同じシェル内で起動された PID でのみ呼び出すことができるため、これはまだ機能しません。
何か案は?
c - Unix-Waitpid'ステータス'
私はC言語を使用してUnixシェルに取り組んでいます。私はwaitpidを使用してプロセスが終了するのを待ち、息子のプロセス(で作成されたfork()
)がのようなシグナルを受信したかどうかを知りたいですSIGSEGV
。
現在のコード:
xwaitpid
親プロセスで呼び出されます。
のようなコマンドを実行しても、WIFSIGNALEDは常にTRUEを返すようfalse || true
です。
誰かが私を助けることができる良いアイデアを持っていますか?
->私の答えを見つけました、ありがとう。
c - 子プロセスを待機中
これは動作している私のプログラムの断片ですが、それを修正するマシンはこれを試みます:
予想される出力は次のとおりです。
しかし、私のプログラムはランダムな数の待機を出力します(このように):
これはコードです:
問題は、内部にwaitpidがあるため、多くの待機が発生していることにあると思います。しかし、それを削除して waitpid をそのままにしておくと、次の出力が表示されます。
そのエラーを発生させずに待機呼び出しを 1 つだけ行う方法はありますか?
fork - waitpidを使用したフォーク出力
上記のコードは、可能な出力は何ですか?
acbc、abcc、baccですが、答えにはbcacが含まれています。bcacはどのように答えになることができますか?親プロセスは、子プロセスが作成される前、またはsthの前に終了しますか。そうしないと?私は混乱しました、どんな説明でも大歓迎です。
Thnx。
perl - Perl から子プロセスを取得する
一連の子を生成するスクリプトがあります。親は、各子が終了するまで待つ必要があります。
私のスクリプトは、次の perl スクリプトと同様に実行されます。
上で提供したコードと同様に、それぞれの子が完了するまでに異なる時間がかかる場合があります。
問題は、子の PID をループして子を取得しようとすると、その最後のforeach
ブロックで、親が作成された順序で子を待機することです。
明らかに、子供たちは生成された順序で終了しないため、たまたま早期に終了する子供向けのゾンビプロセスがたくさん残っています。
私の実際のコードでは、これらの子プロセスが他のプロセスより数日早く終了する可能性があり、ゾンビ プロセスの数が数百単位で増加する可能性があります。
一連の子供たちを刈り取るためのより良い方法はありますか?
c++ - waitpid を使用して別のプロセスのスレッドを待機する
waitpid()
プロセスではなく、個々のスレッドを待機するために使用しようとしています。pthread_join()
またはstd::thread::join()
がスレッドを待つ典型的な方法であることを私は知っています。ただし、私の場合はexecv
、プログラムをフォークして (経由で) 実行し、次にいくつかのスレッドを生成する監視アプリケーションを開発しています。そのため、監視アプリケーションからスレッドに参加することはできません。スレッドは別のプロセスに属しており、ソース コードにアクセスできないためです。それでも、これらの個々のスレッドが終了するのを待つことができるようにしたい.
私が達成しようとしていることを簡単に視覚化するために、より明確にすることを望んで、図を含めます。
プロセスを使用するとすべて正常に動作しますがwaitpid
、スレッドを待機しません。基本的に、呼び出された直後にwaitpid
戻ります(スレッドはその時点でさらに数秒間実行されています)。-1
waitpid
州のドキュメント:
Linux カーネルでは、カーネル スケジュール スレッドは、プロセスとは別個の構成体ではありません。代わりに、スレッドは、Linux 固有の clone(2) システム コールを使用して作成される単なるプロセスです。移植可能な pthread_create(3) 呼び出しなどの他のルーチンは、clone(2) を使用して実装されます。Linux 2.4 より前では、スレッドはプロセスの特殊なケースに過ぎず、結果として、別のスレッドが同じスレッド グループに属している場合でも、あるスレッドは別のスレッドの子を待つことができませんでした。しかし、POSIX はそのような機能を規定しており、Linux 2.4 以降では、スレッドは同じスレッド グループ内の他のスレッドの子を待機することができ、デフォルトで待機します。
その説明は、スレッドから他のスレッドの子への待機のみを考慮しています (私の場合、別のプロセスのスレッドの子を待機したい)。しかし、少なくとも、それwaitpid
はスレッド対応であることを示しています。
これは私がスレッドを待つために使用しているものです:
このコードは、プロセスの待機には機能しますが、スレッドの待機には失敗します (__WALL
フラグが使用されていても)。
実際に を使用してスレッドを待つことができるかどうか疑問に思っていますwaitpid
。使用する必要がある他のフラグはありますか? 別のプロセスのスレッドを待つ方法が説明されているドキュメントを教えてください。
参考までに、スレッドの作成に使用しているコードは次のとおりです。
GCC 4.6 と Ubuntu 12.04 を使用しています。
更新:次を使用して機能させることができましたptrace
:
このコードは、T1、T2、...、Tn がプロセスである場合とスレッドである場合の両方で機能します。
ただし、問題があります。この監視ツールをマルチスレッド C++ アプリケーションで試すと、すべて正常に動作します。しかし、当初の目的は、複数のスレッドを生成する Java アプリケーションでこの監視ツールを使用することでした。マルチスレッド Java アプリケーションを使用するwaitpid
と、ループ内で 1 秒間に何度も起動します (子スレッドは SIGSEGV シグナルによって停止されます)。これは、Java が独自の目的で SIGSEGV を使用しているという事実に関連しているようです (この質問とこの投稿を参照してください)。
これらのウェイクアップはすべて、アプリケーションの速度を大幅に低下させます。私のソリューションに何らかの欠陥があるかどうか、またそれを Java アプリケーションで動作させる方法があるかどうか疑問に思っています。