Dies ist eine rein akademische Frage, da dies niemals passieren wird.
Wenn eine PID als Typ pid_t und nicht als Typ mit beliebiger Genauigkeit gespeichert ist, ist die Anzahl der PIDs, die gleichzeitig vorhanden sein können, begrenzt. Gibt es ein definiertes Verhalten für den Fall, dass PIDs überlaufen?
Wird der 65536. Prozess / sbin / init töten und eine Kernel-Panik auslösen? Oder gibt es eine Sicherheitsmaßnahme?
fork
dies aufgrund von Nein fehlschlägt pid verfügbar.Antworten:
Der
fork
Systemaufruf sollte -1 zurückgeben underrno
auf EAGAIN gesetzt sein . Was danach passiert, hängt von dem aufgerufenen Prozess abfork
.Von der Gabel :
quelle
POSIX gibt nicht an, dass die PID jedes neuen Prozesses durch Inkrementieren der vorherigen PID erhalten wird. Es muss nur eindeutig sein.
Bei einem System, bei dem die PIDs jeweils erhöht werden
fork()
, habe ich festgestellt, dass die Werte nach Erreichen einer Obergrenze (die meiner Erfahrung nach bei etwa 2 bis 15 liegt ) umlaufen . Nach dem Umwickeln werden neue PIDs nicht streng inkrementiert, da einige PID-Werte aus früheren Zyklen weiterhin verwendet werden.Es sollte kein Problem geben, bis 2 N Prozesse gleichzeitig ausgeführt werden. Ich vermute, dass das System lange bevor dies geschah, auf eine Kapazitätsgrenze stoßen würde. In diesem Fall
fork()
würde der Systemaufruf fehlschlagen und wahrscheinlicherrno
aufEAGAIN
oderENOMEM
(man fork
für Details) gesetzt.Der implementierte Code
fork
kann prüfen, ob PIDs verfügbar sind oder nicht. Dies stört möglicherweise nicht, da davon ausgegangen wird, dass die Systemressourcen vor diesem Zeitpunkt aufgebraucht sind, oder es wird eine explizite Überprüfung durchgeführt, um die Vollständigkeit zu gewährleisten und zukünftige Möglichkeiten zu prüfen. Ich habe es nicht überprüft, und wenn ich es hätte, könnte ich nur den Kernel ansprechen, den ich mir angesehen habe.quelle
Die maximale PID-Grenze liegt weit unter
2^((sizeof(int)*CHAR_BIT)
. Siehe Was ist der Maximalwert der Prozess-ID? . Mit anderen Worten, Ihre PIDs werden niemals in die Nähe von 4 Milliarden gehen.Wenn alle PID-Slots belegt sind, schlagen
fork
Anrufe fehlerrno==EAGAIN
(siehe Gabelung (2) ). Wenn Sie einfach nach oben gehen, ohne alle Slots zu füllen, ist die nächste PID der nächste freie Slot nach 1 (1 ist init).quelle