Como funciona uma bifurcação?

20
  • ADVERTÊNCIA NÃO TENTE EXECUTAR ESTA MÁQUINA DE PRODUÇÃO

Ao ler a página da Wikipedia sobre o tópico , eu geralmente acompanho o que está acontecendo com o seguinte código:

:(){ :|:& };:

trecho da descrição

The following fork bomb was presented as art in 2002;56 its exact origin is unknown, but it existed on Usenet prior to 2002. The bomb is executed by pasting the following 13 characters into a UNIX shell such as bash or zsh. It operates by defining a function called ':', which calls itself twice, once in the foreground and once in the background.

No entanto, o último pedaço não está totalmente claro para mim. Eu vejo a definição da função:

:(){ ... }

Mas o que mais está acontecendo? Também outros shells como ksh , csh e tcsh também sofrem o mesmo destino de poder construir algo similar?

    
por slm 31.08.2013 / 04:26

1 resposta

21

Essa garfada sempre me lembra algo que um professor de programação de IA disse em uma das primeiras lições que eu assisti: "Para entender a recursão, primeiro você deve entender a recursão".

Em essência, esta bomba é uma função recursiva . Em essência, você cria uma função, que chama a si mesma, que chama a si mesma, que se chama .... até que os recursos do sistema são consumidos. Neste caso específico, a recursão é amplificada pelo uso da função de piping para si mesma e para o fundo dela.

Eu já vi isso respondido em StackOverflow , e Eu acho que o exemplo dado ali ilustra melhor, só porque é mais fácil ver o que ele faz de relance (roubado do link acima ...)

☃(){ ☃|☃& };☃

Defina a função de erro ☃() { ... } , cujo corpo chama a si mesmo (a função de erro), canalizando a saída para ela mesma (a função de erro) ☃|☃ e exibindo o resultado & . Então, depois que a função é definida, realmente chame a função bug, ; ☃ .

Noto que, pelo menos na minha VM do Arch, a necessidade de criar um plano de fundo para o processo não é um requisito para ter o mesmo resultado final, consumir todo o espaço de processo disponível e processar o host. Na verdade, agora eu disse que às vezes parece encerrar o processo de fuga e depois de uma tela cheia de -bash: fork: Resource temporarily unavailable ele irá parar com um Terminated (e journalctl mostra o bash core dumping).

Para responder à sua pergunta sobre o csh / tcsh, nenhum desses shells suporta funções, você só pode usar alias. Então, para esses shells você teria que escrever um shell script que se chama recursivamente.

O zsh parece sofrer o mesmo destino (com o mesmo código), não faz core dump e faz com que o Arch forneça Out of memory: Kill process 216 (zsh) score 0 or sacrifice child. , mas ainda assim continua bifurcando. Depois de algum tempo, ele indica Killed process 162 (systemd-logind) ... (e ainda continua a ter um zsh de bifurcação).

O Arch não parece ter uma versão em pacman do ksh, então eu tive que experimentá-lo no debian. ksh objetos para : como um nome de função, mas usando algo - digamos b() parece ter o resultado desejado.

    
por 31.08.2013 / 04:42