Como funciona uma bifurcação: no código C (ou C), uma função chamada fork()
é chamada. Isso faz com que o linux ou o Unix ou o Unix-a-likes criem um processo inteiramente novo. Este processo tem um espaço de endereço, um ID de processo, uma máscara de sinal, descritores de arquivos abertos, todos os tipos de coisas que ocupam espaço na memória limitada do kernel do sistema operacional. O processo recém-criado também obtém um ponto na estrutura de dados do kernel para que os processos sejam executados. Para o processo que chamou fork()
, parece que nada aconteceu. Um processo de fork fork tentará chamar fork()
o mais rápido que puder, quantas vezes puder.
O truque é que o processo recém-criado também retorna do fork()
no mesmo código. Depois de um fork, você tem dois processos executando o mesmo código. Cada novo processo fork-bomb tenta chamar fork()
o mais rápido que puder, quantas vezes puder. O código que você deu como exemplo é uma versão Bash-script de uma fork fork.
Em breve, todos os recursos relacionados ao processo do kernel do sistema operacional são usados. A tabela de processos está cheia. A lista de processos em espera está cheia. A memória real está cheia, então a paginação é iniciada. Se isso continuar por muito tempo, a partição de swap será preenchida.
O que isso parece para um usuário: tudo funciona muito devagar. Você recebe mensagens de erro como "não foi possível criar o processo" ao tentar coisas simples como ls
. Tentar um ps
causa uma pausa interminável (se for executada) e devolve uma lista muito longa de processos. Às vezes, essa situação exige uma reinicialização por meio do cabo de alimentação.
As bombas de garfo costumavam ser chamadas de "coelhos" antigamente. Porque eles se reproduziram tão rapidamente.
Apenas por diversão, eu escrevi um programa de fork fork em C:
#include <stdio.h>
#include <unistd.h>
int
main(int ac, char **av)
{
while (1)
fork();
return 0;
}
Eu compilei e executei esse programa no Arch Linux em um xterm. Eu outro xterm eu tentei obter uma lista de processos:
1004 % ps -fu bediger
zsh: fork failed: resource temporarily unavailable
O shell Z no segundo xterm não pôde chamar fork()
com sucesso, pois os processos do fork fork associados ao 1st xterm haviam esgotado todos os recursos do kernel relacionados ao processo criado e em execução.