Это чисто академический вопрос, потому что этого никогда не произойдет.
Если PID хранится как тип pid_t, а не как тип с произвольной точностью, то существует ограничение на количество PID, которые могут существовать одновременно. Есть ли определенное поведение, когда PID переполняется?
Будет ли 65536-й процесс уничтожать / sbin / init и создавать панику ядра? Или есть какие-то меры безопасности?
fork
произойдет сбой из-за отсутствия Пид доступен.Ответы:
fork
Системный вызов должен возвращать -1, и наборerrno
для EAGAIN . Что произойдет после этого, будет зависеть от процесса, который вызвалfork
.С вилки :
источник
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)
. См. Каково максимальное значение идентификатора процесса? , Другими словами, ваши PID никогда не превысят 4 миллиардов.Когда все слоты pid будут заполнены,
fork
вызовы начнут давать сбойerrno==EAGAIN
(см. Fork (2) ). Если вы просто попали в топ, не заполнив все слоты, следующий PID будет следующим свободным слотом после 1 (1 - init)источник