포크 폭탄은 어떻게 작동하나요?

포크 폭탄은 어떻게 작동하나요?
  • 경고 프로덕션 시스템에서 이 프로그램을 실행하지 마십시오.

독서주제에 대한 Wikipedia 페이지나는 일반적으로 다음 코드에서 일어나는 일을 따릅니다.

:(){ :|:& };:

설명 발췌

아래의 포크폭탄은 2002년에 예술품으로 전시되었습니다.56 정확한 출처는 알려져 있지 않지만 2002년 이전에 유즈넷에 존재했습니다. 폭탄은 다음 13자를 붙여넣어 만들어졌습니다. 유닉스 시스템껍질은 마치세게 때리다또는다루기 힘든. 이는 자신을 두 번(포그라운드에서 한 번, 백그라운드에서 한 번) 호출하는 ":"이라는 함수를 정의하여 작동합니다.

그러나 이 마지막 요점은 나에게 완전히 명확하지 않습니다. 함수 정의가 표시됩니다.

:(){ ... }

그런데 또 무슨 일이 일어났나요? 다른 껍질(예: ksh, , csh, )도 tcsh같은 운명을 겪고 비슷한 것을 만들 수 있습니까?

답변1

이 포크폭탄은 제가 첫 수업을 들었을 때 인공지능 프로그래밍 선생님께서 "재귀를 이해하려면 먼저 재귀를 이해해야 한다"고 하신 말씀을 항상 생각나게 합니다.

기본적으로 이 폭탄은재귀적기능. 본질적으로 시스템 리소스가 소모될 때까지 자신을 호출하고 호출하고 호출하는 함수를 만듭니다. 이 특정 인스턴스에서는 파이프를 사용하여 함수를 자체에 전달하고 이를 백그라운드에 배치함으로써 재귀가 증폭됩니다.

나는 이 답변을 보았습니다.스택 오버플로, 나는 거기에 주어진 예가 이것을 가장 잘 설명한다고 생각합니다. 단순히 그것이 무엇을 하는지 한 눈에 보기 더 쉽기 때문입니다(위 링크에서 가져온 것입니다...)

☃(){ ☃|☃& };☃

본문이 자신을 호출하는 버그 함수 ☃() { ... }(버그 함수)를 정의하고, 출력을 자신에게 파이프하고(버그 함수) ☃|☃, 결과를 백그라운드에 넣습니다 &. 그런 다음 함수 정의 후에 실제로 버그 함수가 호출됩니다 ; ☃.

적어도 내 Arch VM에서는 프로세스를 백그라운드에 배치해야 할 때 사용 가능한 모든 프로세스 공간을 소비하고 호스트를 렌더링하는 것과 동일한 최종 결과가 필요하지 않다는 것을 알았습니다. 사실, 지금까지 말했듯이 때때로 런어웨이 프로세스가 종료되는 것처럼 보이며 화면이 표시된 후에는 bash 코어 덤프 -bash: fork: Resource temporarily unavailable로 중지됩니다 .Terminatedjournalctl

csh/tcsh에 대한 질문에 대답하려면 이러한 쉘 중 어느 것도 기능을 지원하지 않으며 별칭만 사용할 수 있습니다. 따라서 이러한 셸의 경우 자신을 재귀적으로 호출하는 셸 스크립트를 작성해야 합니다.

zsh는 코어 덤핑이 아닌 동일한 운명(동일한 코드 사용)을 겪고 Arch가 Out of memory: Kill process 216 (zsh) score 0 or sacrifice child.. 잠시 후 그것은 주장합니다 Killed process 162 (systemd-logind) ...(그리고 여전히 포크된 zsh를 계속 가지고 있습니다).

Arch에는 ksh 버전이 없는 것 같아서 pacman데비안에서 시도해 보아야 했습니다. ksh는 함수 이름에 반대 :하지만 -say와 같은 것을 사용하면 b()원하는 결과를 얻을 수 있는 것 같습니다.

관련 정보