C'est une question purement académique, car cela n'arrivera jamais.
Si un PID est stocké sous le type pid_t, et non avec un type à précision arbitraire, le nombre de PID pouvant exister à la fois est limité. Existe-t-il un comportement défini pour le débordement des PID?
Le processus 65536th tuera / sbin / init et créera une panique du noyau? Ou existe-t-il une mesure de sécurité en place?
fork
échouer en raison de non pid disponible.Réponses:
L'
fork
appel système doit renvoyer -1 et définierrno
sur EAGAIN . Ce qui se passera ensuite dépendra du processus qui a appeléfork
.De la fourche :
la source
POSIX ne spécifie pas que le PID de chaque nouveau processus est obtenu en incrémentant le PID précédent. Il ne demande qu'à être unique.
Sur un système où les PID sont incrémentés sur chacun
fork()
, j'ai observé que les valeurs s'enroulent après avoir atteint une limite supérieure (qui, selon mon expérience, est d'environ 2 15 ). Après le bouclage, les nouveaux PID ne sont pas strictement incrémentés, car certaines valeurs PID seront toujours utilisées à partir des cycles précédents.Il ne devrait pas y avoir de problème tant que vous n'avez pas 2 N exécutant simultanément des processus. Je soupçonne que le système se heurterait à une limite de capacité bien avant que cela ne se produise. Dans ce cas, l'
fork()
appel système échouerait et serait probablement définierrno
surEAGAIN
ouENOMEM
(man fork
pour plus de détails).Le code qui implémente
fork
peut ou non vérifier si des PID sont disponibles. Cela pourrait ne pas déranger, car il suppose que les ressources système se seraient épuisées avant d'arriver à ce point, ou il pourrait avoir une vérification explicite par souci d'exhaustivité et pour gérer les possibilités futures. Je n'ai pas vérifié, et si je l'avais fait, je ne pouvais m'adresser qu'au noyau que j'avais regardé.la source
La limite PID maximale est bien inférieure à
2^((sizeof(int)*CHAR_BIT)
. Voir Quelle est la valeur maximale de l'ID de processus? . En d'autres termes, vos PID n'atteindront jamais les 4 milliards.Lorsque tous les emplacements pid sont remplis, les
fork
appels commencent à échouer avecerrno==EAGAIN
(voir fork (2) ). Si vous frappez simplement le haut sans remplir tous les emplacements, le prochain PID sera le prochain emplacement libre après 1 (1 est init)la source