* nixでは、PIDは実行中のプロセスの一意の識別子です。PIDはどのように生成されますか?それはインクリメントされる単なる整数なのか、リストのようなより複雑な構造なのか?それらはどのようにリサイクルされますか?リサイクルとは、プロセスが終了すると、そのPIDが最終的に別のプロセスで再利用されることを意味します。
* nixでは、PIDは実行中のプロセスの一意の識別子です。PIDはどのように生成されますか?それはインクリメントされる単なる整数なのか、リストのようなより複雑な構造なのか?それらはどのようにリサイクルされますか?リサイクルとは、プロセスが終了すると、そのPIDが最終的に別のプロセスで再利用されることを意味します。
回答:
ウィキペディアは言います、
Unixでは、プロセスIDは通常、0から始まりシステムごとに異なる最大値まで上昇する順番で割り当てられます。この制限に達すると、割り当てはゼロから再開され、再び増加します。ただし、このパスおよび後続のパスでは、プロセスにまだ割り当てられているPIDはスキップされます。
したがって、それは実際には「生成」の非常に単純なポリシーであり、単にカウンターをインクリメントし、「リサイクル」し、最大値で数値をラップし、終了してプロセスに割り当てられた番号を見つけるまでインクリメントを続けますプロセステーブルから削除されました。
AIXなどの一部のUnix実装では、それほど単純ではないポリシーを使用しています。たとえば、このFAQを参照してください。
それは異なります。
ほとんどのシステムは、最後に生成されたPIDのカウントを保持し、1を追加して(65535以下の最大数でラップ-多くの場合、65000または60000でラップが発生します)、その数が現在使用されていないことを確認します( PIDがまだ使用されている場合は繰り返します。したがって、カーネルであるPID 1はまだ存在し、「再発行」されません。
他のセキュリティ重視のシステムは、ランダムに番号を生成し、使用されていないことを確認します。
常に、すべてのPID番号が一意であることが保証されています。
質問のリサイクル部分に関して、心に留めておくべきことの1つは、そのpidを持つプロセスが終了してもすぐにはpidが使用可能にならないということです。pidは、そのプロセスの親が何らかの形式のwait()システムコールを介してその子の終了ステータスを収集するまで利用できません。終了したが、親が待機を発行していない子はゾンビと呼ばれ、通常はpsに無効として表示されます。悪い振る舞いの親は、子を起動し、それらを待機しない場合、pidのシステムを枯渇させる可能性があります。
プロセスの親が子のステータスを収集する前に死んだ場合、それは問題ありません。子は、wait()が発行され、pidがリサイクルされることを確認するinitによって継承されます。
myprog &
ことで、その後はwait $!
UBだろう。