Fork: Valor de retorno negativo

4

A partir da página man fork (2):

RETURN VALUE
   On success, the PID of the child process is returned in the parent, and
   0 is returned in the child.  On failure, -1 is returned in the  parent,
   no child process is created, and errno is set appropriately.

Eu estou querendo saber sobre as razões que fariam uma chamada de garfo falhar. Quais são os cenários onde o fork retorna -1?

Estou escrevendo um shell Unix padrão em C. Como devo lidar com o erro?

    
por rahmu 21.08.2011 / 15:44

3 respostas

8

Na API C, as chamadas do sistema retornam um valor negativo para indicar um erro, e o código de erro em errno fornece mais informações sobre a natureza do erro. Sua página man deve explicar os possíveis erros no seu sistema. Existem dois códigos de erro padrão :

  • EAGAIN indica que o novo processo não pode ser criado devido à falta de recursos disponíveis, memória insuficiente de algum tipo ou um limite que foi atingido, como o número máximo de processos por usuário ou no geral.
  • ENOMEM indica que o novo processo não pode ser criado devido à falta de memória de algum tipo. No Linux, ENOMEM indica falta de memória do kernel, enquanto a falta de memória do usuário é reportada como EAGAIN . No OpenBSD, ENOMEM é usado também para a falta de memória do usuário.

Em resumo, fork pode falhar devido à falta de recursos disponíveis (possivelmente na forma de um limite artificial em vez de uma simples falta de memória).

O comportamento de shells quando fork falha não é especificado por POSIX. Na prática, eles tendem a retornar diferentes estados de erro (1 em pdksh, 2 em cinza, 254 em bash, 258 em ksh93, 1 em tcsh; zsh retorna 0 que é um bug). Se você estiver implementando um shell para uso em produção (em oposição a um exercício de aprendizado), talvez valha a pena discutir isso no Grupo de Austin

    
por 21.08.2011 / 16:25
3

Eu sei que o kernel tem um parâmetro NPROC que informa a quantidade máxima de processos que podem ser executados ao mesmo tempo. Eu imagino que se você já estiver no máximo e tentar criar outro, você será negado no kernel e retornará -1 para seu pai.

Em outra nota, o kernel também tem um limite de processos por usuário armazenado no parâmetro MAXUPRC . O mesmo acordo aplica-se como acima.

    
por 21.08.2011 / 15:49
1

Um possível motivo seria a incapacidade de gerar um novo processo devido a limitações de cota ou alguma falha do sistema.

Ao escrever softwares, você nem sempre sabe por que algo pode falhar, mas ter uma maneira bem definida de lidar com cada etapa, se ela não der certo, é sempre uma boa ideia.

    
por 21.08.2011 / 15:50

Tags