私は現在オペレーティング システムの授業を受けており、先生は授業時間の半分を PID について話していました。彼女は、多くの人が知っているように、プロセスは親の ID を知っていると述べました。
私の質問はこれです:
プロセスの PCB はその子の ID を知っていますか? もしそうなら、それを取得する方法は何ですか?
私は現在オペレーティング システムの授業を受けており、先生は授業時間の半分を PID について話していました。彼女は、多くの人が知っているように、プロセスは親の ID を知っていると述べました。
私の質問はこれです:
プロセスの PCB はその子の ID を知っていますか? もしそうなら、それを取得する方法は何ですか?
私が知る限り、プロセスには子の PID の明示的なリストはありませんが、プロセスは自分がどの子プロセスを生成するかを知っている必要があるため、簡単に構築できます。たとえば、UNIX の fork() 呼び出しは、親プロセスでは子 PID を返し、子プロセスでは 0 を返します。Windows の CreateProcess() は、作成された新しいプロセスの PID (IIRC) を返します。
*nix で使用するfork()
と、戻り値は親プロセスでは子の PID、子プロセスでは 0 になります。それが調べる方法の 1 つです。
彼らがプロセス生成の「ツリー」を追跡しているかどうかはわかりませんが、使用するOSに依存すると思いますが、bash(または任意のシェル)を強制終了すると、実行中のすべての子も強制終了されるため、UNIXのようなシステムはそうすると思いますこれを追跡します。
Linux や Unix API を実装するものを使用している場合、プロセスが fork() を呼び出して子プロセスを作成すると、親プロセスは戻りコードとして子 PID を受け取ります。フォークが失敗した場合は -1 を受け取ります。子プロセスはゼロのリターン コードを受け取ります。
プロセスの PCB は、その子の ID を知っています。
既知のように、Fork() はプロセスの作成に使用されます。引数はなく、プロセス ID を返します。新しい子プロセスが作成された後、親と子の両方が fork() に続く次の命令を実行します。そこで、親と子を区別する必要があります。これは、fork() の戻り値をテストすることによって行うことができます。
Fork() が負の値を返す場合、子プロセスの作成は失敗しています。Fork() が新しく作成された子プロセスにゼロを返す場合。Fork() が子プロセスのプロセス ID として正の値を親プロセスに返す場合。