이 포크 폭탄은 AI 프로그래밍 교사가 내가 처음 접한 수업 중 하나에서 "재귀를 이해하려면 먼저 재귀를 이해해야합니다"라고 말한 것을 상기시킵니다.
핵심은이 폭탄이 재귀 함수입니다. 본질적으로, 시스템 리소스가 소비 될 때까지 자체를 호출하고 자신을 호출하는 기능을 생성합니다. 이 특정 예에서, 재귀는 함수를 그 자체로 파이핑하고 배경을 사용하여 증폭됩니다.
나는 이것이 StackOverflow 에서 답을 얻은 것을 보았고 , 주어진 예제가 그것이 한 눈에 이해하기 쉽기 때문에 (위의 링크에서 도난 당했기 때문에) 가장 잘 설명한다고 생각합니다 ...
☃(){ ☃|☃& };☃
버그 함수를 정의하는 ☃() { ... }
본문 (버그 함수), 출력을 자체 파이프 (버그 함수) ☃|☃
및 결과의 배경을 정의하십시오 &
. 그런 다음 함수가 정의 된 후에 실제로 버그 함수를 호출하십시오 ; ☃
.
최소한 내 Arch VM에서 프로세스를 백그라운드로 처리해야 할 필요는 없습니다. 사용 가능한 모든 프로세스 공간을 소비하고 호스트를 b0rked로 렌더링하기 위해 동일한 최종 결과를 요구할 필요는 없습니다. 실제로 지금은 때때로 도망가는 프로세스를 종료하는 것으로 보이며 한 번의 심사 후에 -bash: fork: Resource temporarily unavailable
는 Terminated
(와 함께 journalctl
bash 코어 덤프가 표시됨) 중지됩니다 .
csh / tcsh에 대한 질문에 대답하기 위해 해당 쉘 중 어느 것도 함수를 지원하지 않으므로 별칭 만 사용할 수 있습니다. 따라서 해당 쉘의 경우 재귀 적으로 호출되는 쉘 스크립트를 작성해야합니다.
zsh는 (동일한 코드로) 동일한 운명을 겪고 코어 덤프를하지 않으며 Arch 가주는 원인이 Out of memory: Kill process 216 (zsh) score 0 or sacrifice child.
되지만 여전히 포크합니다. 잠시 후 그것은 상태 Killed process 162 (systemd-logind) ...
(그리고 여전히 포크 zsh를 계속)를 나타냅니다.
아치에는 pacman
ksh 버전 이없는 것 같아서 대신 데비안에서 시도해야했습니다. ksh 객체를 :
함수 이름으로 사용하지만 무언가를 사용 b()
하면 원하는 결과를 얻는 것처럼 보입니다.