Esta é uma questão puramente acadêmica, porque isso nunca acontecerá.
Se um PID for armazenado como o tipo pid_t, e não algum tipo de precisão arbitrária, haverá um limite para o número de PIDs que podem existir ao mesmo tempo. Existe um comportamento definido para quando os PIDs excederem?
O 65536 ° processo matará / sbin / init e criará um pânico no kernel? Ou existe alguma medida de segurança em vigor?
fork
falhar por não pid disponível.Respostas:
O
fork
syscall deve retornar -1 e definidoerrno
como EAGAIN . O que acontecer depois disso dependerá do processo chamadofork
.Do garfo :
fonte
O POSIX não especifica que o PID de cada novo processo seja obtido incrementando o PID anterior. Requer apenas que seja único.
Em um sistema em que os PIDs são incrementados em cada um deles
fork()
, observei que os valores retornam após atingir um limite superior (que na minha experiência é de cerca de 2 15 ). Depois de entender, os novos PIDs não são estritamente incrementados, pois alguns valores de PID ainda serão utilizados nos ciclos anteriores.Não deve haver problema até que você tenha 2 N executando processos simultaneamente . Suspeito que o sistema tenha algum limite de capacidade muito antes disso. Nesse caso, a
fork()
chamada do sistema falharia e provavelmente configuradaerrno
comoEAGAIN
ouENOMEM
(man fork
para detalhes).O código implementado
fork
pode ou não verificar se existem PIDs disponíveis. Pode não incomodar, porque pressupõe que os recursos do sistema acabariam antes de chegar a esse ponto, ou pode ter uma verificação explícita por uma questão de integridade e para lidar com possibilidades futuras. Eu não verifiquei, e se eu tivesse, poderia apenas resolver o kernel que eu tinha examinado.fonte
O limite máximo de PID é muito muito menor que
2^((sizeof(int)*CHAR_BIT)
. Consulte Qual é o valor máximo do ID do Processo? . Em outras palavras, seus PIDs nunca chegarão perto de 4 bilhões.Quando todos os slots pid estiverem preenchidos, as
fork
chamadas começarão a falharerrno==EAGAIN
(consulte a bifurcação (2) ). Se você simplesmente atingir o topo sem preencher todos os slots, o próximo PID será o próximo slot livre após 1 (1 é init)fonte