[Bash] Analysons maintenant la bombe Fork

introduction

** * Inutile de dire, veuillez prendre la responsabilité personnelle promise **

La célèbre bombe Fork. Pour Bash: :(){ :|: & };:

Ce principe ne m'est pas venu à l'esprit, alors j'ai essayé de l'analyser ** après avoir confirmé l'opération (!) **.

Il est répertorié dans l'ordre (ou pire, bâclé), donc j'apprécierais que vous puissiez simplement le lire comme matériel de lecture (poème).

Histoire principale

Modifié pour faciliter la lecture et la suppression

Utilisez bomb comme nom de fonction au lieu de:. bomb() { bomb | bomb & }; bomb

Une fois lâché, il a explosé ** et a dû être redémarré **. Tout d'abord le succès? est!

Essayez de courir au premier plan

Il est difficile de redémarrer à chaque fois, alors mettons-le au premier plan.

bomb() { bomb | bomb ; }; bomb

C'est aussi en train d'exploser, mais il semble qu'il puisse être restauré par Ctrl + C ou en fermant le terminal. Cette exécution au premier plan se poursuivra pour l'analyse.

Essaye de dormir

De même, il semble que l'analyse prendra du temps, je vais donc attendre environ 10 secondes.

bomb() { sleep 10 ; bomb | bomb ; }; bomb

Si vous le vérifiez dans un autre terminal, vous pouvez voir qu'il se dirige ** lentement vers la ruine **. (Les «-bash» et «sleep 10» suivants augmenteront avec le temps)

user@user-VirtualBox:~$ ps -f -u user | grep pts/2
user     25428 25363  0 15:54 ?        00:00:00 sshd: user@pts/2
user     25429 25428  0 15:54 pts/2    00:00:00 -bash
user     26605 25429  0 15:56 pts/2    00:00:00 -bash
user     26606 25429  0 15:56 pts/2    00:00:00 -bash
user     26607 26606  0 15:56 pts/2    00:00:00 sleep 10
user     26608 26605  0 15:56 pts/2    00:00:00 sleep 10
user     26612 25777  0 15:56 pts/3    00:00:00 grep --color=auto pts/2

Préparez le journal

Essayez de vous connecter à un fichier appelé «foo». Vous pouvez toujours le lire avec une seule doublure.

bomb() { sleep 10 ; echo `date +%H:%M:%S.%3N`: Throw 2 bombs... >> foo ; bomb | bomb ; }; bomb

Le résultat de la confirmation du journal dans un autre terminal:

user@user-VirtualBox:~$ tail -f foo
16:15:14.374: Throw 2 bombs...
16:15:24.378: Throw 2 bombs...
16:15:24.379: Throw 2 bombs...
16:15:34.384: Throw 2 bombs...
16:15:34.385: Throw 2 bombs...
16:15:34.388: Throw 2 bombs...
16:15:34.389: Throw 2 bombs...

Quel merveilleux journal (éloge de soi)!

  1. Déposez-en deux à 16:15:14
  2. Drop 2 + 2 = 4 à 16:15:24
  3. Drop 2 + 2 + 2 + 2 = 8 à 16:15:34

Par conséquent, il est devenu clair que ** le nombre de bombes (processus) augmente dans le jeu ** fois! Ce serait effrayant si je n'avais pas dormi pendant 10 secondes! Lol

Essayez d'en faire un

Tout le monde se demandera (n'est-ce pas?), Et un? est.

bomb() { sleep 10 ; echo `date +%H:%M:%S.%3N`: Throw a bomb... >> foo ; bomb ; }; bomb

Le journal est un résultat naturel:

user@user-VirtualBox:~$ tail -f foo
16:28:09.661: Throw a bomb...
16:28:19.664: Throw a bomb...
16:28:29.668: Throw a bomb...

Le résultat de la confirmation du processus est le suivant (confirmé à des intervalles appropriés):

user@user-VirtualBox:~$ ps -f -u user | grep pts/2
user     25428 25363  0 15:54 ?        00:00:00 sshd: user@pts/2
user     25429 25428  0 15:54 pts/2    00:00:00 -bash
user     26743 25429  0 16:28 pts/2    00:00:00 sleep 10
user     26746 25777  0 16:28 pts/3    00:00:00 grep --color=auto pts/2
user@user-VirtualBox:~$ ps -f -u user | grep pts/2
user     25428 25363  0 15:54 ?        00:00:00 sshd: user@pts/2
user     25429 25428  0 15:54 pts/2    00:00:00 -bash
user     26748 25429  0 16:28 pts/2    00:00:00 sleep 10
user     26750 25777  0 16:28 pts/3    00:00:00 grep --color=auto pts/2
user@user-VirtualBox:~$ ps -f -u user | grep pts/2
user     25428 25363  0 15:54 ?        00:00:00 sshd: user@pts/2
user     25429 25428  0 15:54 pts/2    00:00:00 -bash
user     26754 25429  0 16:28 pts/2    00:00:00 sleep 10
user     26756 25777  0 16:28 pts/3    00:00:00 grep --color=auto pts/2
user@user-VirtualBox:~$

Vous pouvez voir que le processus original -bash est actif tout le temps et que le processus sleep 10 est lancé séparément ( 2674326748 26754).

En d'autres termes, le nouveau processus est en cours d'exécution, mais le processus précédent est terminé à chaque fois, il ne se multiplie donc pas.

Pour le dire clairement, c'est une boucle infinie qui répète simplement bombe **.

Essayez de faire un point-virgule à partir d'un tuyau

Mais que se passe-t-il si l'espace entre les deux bombes est «;» au lieu de «|»?

bomb() { sleep 10 ; echo `date +%H:%M:%S.%3N`: Throw 1st bomb... >> foo ; bomb ; echo `date +%H:%M:%S.%3N`: Throw 2nd bomb... >> foo ; bomb ; }; bomb

user@user-VirtualBox:~$ tail -f foo
16:42:05.384: Throw 1st bomb...
16:42:15.387: Throw 1st bomb...
16:42:25.390: Throw 1st bomb...

Vous n'avez pas atteint la «2e bombe». C'est parce que la «1ère bombe» est répétée tout le temps, et la substance est la même que dans le cas d'une bombe.

en conclusion

Impressions (poème)

Voir c'est croire. C'était une méthode simple, mais elle est redevenue plus intelligente. Lol

Environnement de confirmation

--Ubuntu 18.04 LTS (sur VM)

Recommended Posts

[Bash] Analysons maintenant la bombe Fork
Analysons les données de l'enquête par questionnaire [4e: Analyse des émotions]
Supprimons maintenant l'ambiguïté du trait d'union (-) de la commande su! !!
Analysons les émotions de Tweet en utilisant Chainer (2ème)
Analysons les émotions de Tweet en utilisant Chainer (1er)