Esta es una pregunta puramente académica, porque esto nunca sucederá.
Si un PID se almacena como tipo pid_t, y no como un tipo de precisión arbitraria, entonces hay un límite para el número de PID que pueden existir al mismo tiempo. ¿Existe un comportamiento definido para cuando los PID se desbordan?
¿El proceso 65536th matará / sbin / init y creará un kernel panic? ¿O hay alguna medida de seguridad en el lugar?
fork
falle por no pid disponible.Respuestas:
La
fork
llamada al sistema debería devolver -1 y establecerseerrno
en EAGAIN . Lo que suceda después de eso dependerá del proceso que llamófork
.De tenedor :
fuente
POSIX no especifica que el PID de cada nuevo proceso se obtiene al incrementar el PID anterior. Solo requiere que sea único.
En un sistema donde los PID se incrementan en cada uno
fork()
, he observado que los valores se ajustan después de alcanzar un límite superior (que en mi experiencia es de alrededor de 2 15 ). Después de finalizar, los nuevos PID no se incrementan estrictamente, ya que algunos valores de PID seguirán en uso en ciclos anteriores.No debería haber ningún problema hasta que tenga 2 N ejecutando procesos simultáneamente . Sospecho que el sistema alcanzaría algún límite de capacidad mucho antes de que eso sucediera. En ese caso, la
fork()
llamada al sistema fallaría y probablemente se estableceríaerrno
enEAGAIN
oENOMEM
(man fork
para más detalles).El código que implementa
fork
puede o no verificar si hay PID disponibles. Puede que no moleste, porque supone que los recursos del sistema se habrían agotado antes de llegar a ese punto, o podría tener una verificación explícita en aras de la integridad y para manejar las posibilidades futuras. No lo he comprobado, y si lo hubiera hecho, solo podría direccionar el núcleo que había visto.fuente
El límite máximo de PID es mucho mucho menor que
2^((sizeof(int)*CHAR_BIT)
. Consulte ¿Cuál es el valor máximo de la ID de proceso? . En otras palabras, sus PID nunca se acercarán a los 4 mil millones.Cuando se llenen todos los espacios pid, las
fork
llamadas comenzarán a fallar conerrno==EAGAIN
(ver fork (2) ). Si simplemente toca la parte superior sin llenar todos los espacios, el siguiente PID será el siguiente espacio libre después de 1 (1 es init)fuente