Эта вилочная бомба всегда напоминает мне то, что сказал учитель по программированию ИИ на одном из первых уроков, которые я посетил: «Чтобы понять рекурсию, сначала вы должны понять рекурсию».
По сути, эта бомба - рекурсивная функция. По сути, вы создаете функцию, которая вызывает себя, которая вызывает себя, которая вызывает себя .... до тех пор, пока системные ресурсы не будут израсходованы. В этом конкретном случае рекурсия усиливается за счет использования функции для ее передачи и создания фона.
Я видел ответ на 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).
Arch, похоже, не имеет pacman
версии ksh, поэтому мне пришлось попробовать ее на Debian. ksh возражает :
как имя функции, но использует что-то, скажем, b()
вместо этого, похоже, желаемый результат.