Cette bombe fourchue me rappelle toujours quelque chose qu'un professeur de programmation d'IA a dit lors d'une des premières leçons auxquelles j'ai assisté "Pour comprendre la récursivité, vous devez d'abord comprendre la récursivité".
Au fond, cette bombe est une fonction récursive . En substance, vous créez une fonction, qui s'appelle, qui s'appelle, qui s'appelle .... jusqu'à ce que les ressources système soient consommées. Dans ce cas précis, la récursivité est amplifiée par l'utilisation de la fonction de tuyauterie pour elle-même ET de son arrière-plan.
J'ai vu cette réponse sur StackOverflow , et je pense que l'exemple donné ici l'illustre mieux, juste parce qu'il est plus facile de voir ce qu'il fait en un coup d'œil (volé à partir du lien ci-dessus ...)
☃(){ ☃|☃& };☃
Définissez la fonction de bogue ☃() { ... }
, dont le corps s'appelle (la fonction de bogue), redirigez la sortie vers elle-même (la fonction de bogue) ☃|☃
, et mettez le résultat en arrière-plan &
. Puis, après la fonction est définie, appelez en fait la fonction de bogue, ; ☃
.
Je note qu'au moins sur ma machine virtuelle Arch, la nécessité d'arrière-plan du processus n'est pas une exigence pour avoir le même résultat final, pour consommer tout l'espace de processus disponible et rendre l'hôte b0rked. En fait, maintenant, j'ai dit qu'il semblait parfois mettre fin au processus de fuite et qu'après une sélection, -bash: fork: Resource temporarily unavailable
il s'arrêterait avec un Terminated
(et montrait le vidage du journalctl
noyau bash).
Pour répondre à votre question sur csh / tcsh, aucun de ces shells ne prend en charge les fonctions, vous pouvez uniquement créer un alias. Donc, pour ces shells, vous devez écrire un script shell qui s'appelle récursivement.
zsh semble subir le même sort (avec le même code), ne fait pas de vidage de mémoire et oblige Arch à donner Out of memory: Kill process 216 (zsh) score 0 or sacrifice child.
, mais il continue à bifurquer. Après un certain temps, il indique ensuite Killed process 162 (systemd-logind) ...
(et continue d'avoir un zsh de fourche).
Arch ne semble pas avoir de pacman
version de ksh, j'ai donc dû l'essayer sur debian à la place. ksh objecte en :
tant que nom de fonction, mais en utilisant quelque chose - dire à la b()
place semble avoir le résultat souhaité.