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