|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Membre du Club
![]() Inscription : juin 2005 Messages : 255 ![]() |
Bonjour,
Comment marche cette commande qui fait planter le pinguoin: <<:(){ :|:&};:>> (enlever le << et le >>). Je l'ai testée sous fedora, le système se fige... sincèrement
__________________
Je créer des sites web et je ne suis fan de voiture teintée et tout ce qui à trait au tuning: customisation, kit xenon, vitres teinté voiture et course automobile. |
|
|
00
|
|
|
#2 | ||
|
Membre Expert
![]() Inscription : septembre 2004 Messages : 2 180 ![]() |
Vous seriez nantais, que je n'en serai pas surpris
Ce code :joue sur le fait que le shell (bash) accepte : comme nom valide pour une fonction. on peut le ré-écrire, de façon plus lisible, ainsi : Code :
On lance ensuite cette fonction tueuse ... Le système se fige alors rapidement à cause de la multiplication des forks qui en résulte ...
__________________
|
||
|
|
00
|
|
|
#3 |
|
Membre du Club
![]() Inscription : juin 2005 Messages : 255 ![]() |
Ok.
merci pour la réponse ! |
|
|
00
|
|
|
#4 |
|
Expert Confirmé
![]() Inscription : mars 2004 Messages : 3 109 ![]() |
Ca fait planter tout système d'exploitation, pas seulement Linux.
C'est une boucle infinie... |
|
|
00
|
|
|
#5 | |
|
Membre du Club
![]() Inscription : juin 2005 Messages : 255 ![]() |
Citation:
merci pour ce rappel, j'oubliais que linux c'est QUE le noyau. (sourire) |
|
|
|
00
|
|
|
#6 |
|
Membre émérite
![]() Inscription : janvier 2004 Messages : 990 ![]() |
Une simple fonction réccursive qui se rappel à l'infini ne provoquerait pas le même effet ?
Bash attend bien que la fonction ait fini de s'exécuté avant de piper le contenu non ? Et comme le premier appel ne rend pas la main, il n'y a aucun contenu pipé, donc le deuxième appel (celui juste après le pipe) n'est jamais exécuté. Enfin voilà, des gens sont-ils capable d'expliquer précisément toutes les étapes avant le freez ?
__________________
Les vaches ne peuvent PAS voler, quoi qu'elles aient pu vous raconter. |
|
|
00
|
|
|
#7 | ||||
|
Membre Expert
![]() Inscription : septembre 2004 Messages : 2 180 ![]() |
Citation:
Citation:
Il y a donc bien exécution simultanée de ce qui est avant le pipe et de ce qui est après et en attends les données. La preuve par l'exemple : Code :
{ for i in $( seq 1 120) ; do echo $i ; sleep 1; done } | less Citation:
A la dixième génération, on a déja 512 + 256 + 128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = 1023 appels simultanés, et ça double encore ...) Citation:
A moins d'avoir, actif au préalable, un watchdog qui va flinguer ce qui pose problème, c'est le blocage. La machine n'est plus récupérable, puis qu'il devient impossible de s'y connecter (plus de fork pour lancer de nouveaux shells) et les connexions déjà établies sont inutilisables (plus de fork pour lancer les commandes). Je me demande (je n'ai pas voulu tester, j'ai besoin de ma machine
__________________
|
||||
|
|
00
|
|
|
#8 | ||||
|
Nouveau Membre du Club
![]() Inscription : octobre 2004 Messages : 56 ![]() |
tant qu'on est dans ce genre de question :
Citation:
Code :
mais quand il n'y en aura plus, ne vas telle tout simplement pas planter, mourir et liberer la memoire utilisé ? (j'ai pas trop envie de tester, la derniere fois j'ai du reinstaller le systeme avec des betises pareilles) |
||||
|
|
00
|
|
|
#9 | ||
|
Membre émérite
![]() Inscription : janvier 2004 Messages : 990 ![]() |
2Eurocents, comme l'a un peu dit xlurp, lorsque la limite de processus est atteinte, l'appel à la fonction devrait échouer et la fonction appellante devrait rendre la main et donc tout ça devrait "dérécursionner".
Si ce que j'ai dit s'avère vrai, il suffit de rajouter une boucle infinie Code :
Ne pas tenter à la maison ! ^^
__________________
Les vaches ne peuvent PAS voler, quoi qu'elles aient pu vous raconter. |
||
|
|
00
|
|
|
#10 |
|
Membre émérite
![]() ![]() Inscription : octobre 2004 Messages : 668 ![]() |
Sous linux, ca freeze lamentablement car il n'y a pas de controle sur le nombre de processus : on rempli allegrement la table des process en mémoire, puis éventuellement on swap des process pour faire de la place et accueillir les (toujours) nouveau processus qui sont créés. Manque de pot, dans le tas, il y a des processus sytèmes "utiles" (scheduler, swapper), etc...
Là où ca devient dramatique, c'est lorsqu'un processus sytème "important" veut (doit) reprendre la main (un de ceux cités précédemment) : il est forcément sur le swap, puisqu'on a tout rempli avec la bombe fork : problème, il n'y a plus de place dans la table des processus pour permettre de dé-swapper le process en question... On attend donc qu'il y en ai un qui rende la main... Et comme ça n'arrive jamais, on freeze... Par contre, sur un FreeBSD, il n'y a pas ce genre de problème, car le système conserve par devers tout une petite place dans la table des processus dédiée aux processus sytèmes : ceux-ci pourront donc toujours swapper... Donc sur un FreeBSD (j'ai testé pour vous
__________________
Software becomes slower faster than hardware becomes faster http://xrenault.developpez.com API C standard (C ANSI ) |
|
|
00
|
|
|
#11 |
|
Membre habitué
![]() Inscription : décembre 2004 Messages : 129 ![]() |
Avec cette commande on peut limiter le nombre de processus pour un utilisateur.
|
|
|
00
|
|
|
#12 | |||
|
Membre habitué
![]() Inscription : décembre 2004 Messages : 129 ![]() |
Citation:
Et quand il n'y aura plus assez de mémoire pour les appels récursifs, tu auras droit à une belle erreur de segmentation qui interrompra ton processus sans cause le moindre dégât au niveau du système. Code :
|
|||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com