これは決して起こらないので、これは純粋に学術的な質問です。
PIDがタイプpid_tとして格納されており、任意精度型ではない場合、一度に存在できるPIDの数には制限があります。PIDがオーバーフローしたときの動作は定義されていますか?
65536番目のプロセスで/ sbin / initが強制終了され、カーネルパニックが発生しますか?または、安全対策が講じられていますか?
fork
に、利用可能なpid。
これは決して起こらないので、これは純粋に学術的な質問です。
PIDがタイプpid_tとして格納されており、任意精度型ではない場合、一度に存在できるPIDの数には制限があります。PIDがオーバーフローしたときの動作は定義されていますか?
65536番目のプロセスで/ sbin / initが強制終了され、カーネルパニックが発生しますか?または、安全対策が講じられていますか?
fork
に、利用可能なpid。
回答:
POSIXは、各新しいプロセスのPIDが以前のPIDをインクリメントすることによって取得されることを指定していません。一意である必要があります。
PIDが各fork()
でインクリメントされるシステムでは、値が上限(私の経験では約2 15)に達した後、値が折り返されることがわかりました。一部のPID値は以前のサイクルで引き続き使用されているため、ラップアラウンド後、新しいPIDは厳密にはインクリメントされません。
2 Nの プロセスを同時に実行するまで、問題は発生しません。それが起こるずっと前に、システムが何らかの容量制限に遭遇するのではないかと思います。その場合、fork()
システムコールは失敗し、おそらく(または詳細)に設定さerrno
れます。EAGAIN
ENOMEM
man fork
実装fork
するコードは、PIDが使用可能かどうかをチェックする場合としない場合があります。その時点に到達する前にシステムリソースが不足すると想定しているため、または完全性のために明示的なチェックがあり、将来の可能性を処理するために、気にしないかもしれません。私はチェックしていません。もし持っていた場合、私が見たカーネルにしか対処できませんでした。
最大PID制限は、をはるかに下回り2^((sizeof(int)*CHAR_BIT)
ます。プロセスIDの最大値はいくつですか?を参照してください。。つまり、PIDが40億近くになることはありません。
すべてのpidスロットがいっぱいにfork
なると、呼び出しが失敗し始めますerrno==EAGAIN
(fork(2)を参照)。すべてのスロットを埋めずに単に上を打った場合、次のPIDは1の後の次の空きスロットになります(1はinit)