:(){:|:&};: 이 BASH 포크 폭탄은 정확히 어떻게 작동하나요? [복사]

:(){:|:&};: 이 BASH 포크 폭탄은 정확히 어떻게 작동하나요? [복사]

쉘, 서브쉘, 기능 및 백그라운드 프로세스에 대한 나의 지식은 매우 단편적이므로 이 포크 폭탄의 세부 작동 방식을 이해하는 데 자신감이 부족합니다.

그러나 나는 내가 알고 있는 것을 여러분에게 말하겠습니다.

  • :() 여기서 콜론은 특이하게 생긴 함수 이름일 뿐입니다.
  • {...} 이는 함수가 수행하는 작업을 설명합니다.
  • {:()} 이 함수는 다음 반복에서 자신을 호출합니다.
  • {:()&} 이 함수는 자신을 호출하고 자신의 다음 반복을 셸의 배경에 넣습니다.
  • ...;: 마지막 콜론은 함수의 실제 실행을 위한 시작점이고, 이전 콜론은 정의일 뿐입니다.

그래서 제가 기본적으로 이해하는 바는 이것이 계란을 낳는 기계처럼 작동하여 시스템이 더 이상 사회 복지를 전파할 수 없을 때까지 자신의 복사본을 생성하는 재귀 함수라는 것입니다.

그러나 나는 단계별로 무슨 일이 일어나고 있는지 시각적으로 이해하지 못했습니다.

예를 들어

  • :()|:()& 두 함수 호출이 파이프 기호로 그룹화되는 이유는 무엇입니까?
  • 포크 폭탄은 시간 단위당 프로세스 수가 일정한 선형 방식으로 생성됩니까, 아니면 두 함수 호출이 제안하는 것처럼 기하급수적으로 증가합니까?

아무리 엉성하더라도 산란 과정에 대한 단계별 시각적 만화를 추가로 제공할 수 있습니까?

답변1

다음은 시각적인 설명입니다. 죄송합니다. 만화는 아니지만 설명이 필요합니다.

  • 1단계: 함수 실행

    :
    
  • 2단계: 이 함수는 파이프를 사용하여 두 복사본을 병렬로 시작하여 두 개의 복사본을 실행합니다(답변에서 언급한 것처럼 백그라운드 연산자는 여기서 중요하지 않은 것 같습니다).포크 폭탄은 어떻게 작동하나요?)

    (:|:)
    

    (여기서는 명확성을 위해 괄호를 사용했습니다)

  • 3단계: 각각에 대해 프로세스를 반복합니다.:

    ((:|:)|(:|:))
    
  • 그래서 계속된다

    (((:|:)|(:|:))|((:|:)|(:|:)))
    

    등, 각 단계 :에서(:|:)

    ((((:|:)|(:|:))|((:|:)|(:|:)))|(((:|:)|(:|:))|((:|:)|(:|:))))
    
    (((((:|:)|(:|:))|((:|:)|(:|:)))|(((:|:)|(:|:))|((:|:)|(:|:))))|((((:|:)|(:|:))|((:|:)|(:|:)))|(((:|:)|(:|:))|((:|:)|(:|:)))))
    
    ((((((:|:)|(:|:))|((:|:)|(:|:)))|(((:|:)|(:|:))|((:|:)|(:|:))))|((((:|:)|(:|:))|((:|:)|(:|:)))|(((:|:)|(:|:))|((:|:)|(:|:)))))|(((((:|:)|(:|:))|((:|:)|(:|:)))|(((:|:)|(:|:))|((:|:)|(:|:))))|((((:|:)|(:|:))|((:|:)|(:|:)))|(((:|:)|(:|:))|((:|:)|(:|:))))))
    

시스템의 리소스가 부족해질 때까지 기다리십시오(이 시점에서 실제로는 매우 응답하지 않게 됩니다).

관련 정보