Forum Linux.pl
Programowanie => Bash, skrypty powłoki => Wątek zaczęty przez: w 2007-12-16, 22:10:19
-
Na wykładzie z Unixa profesor podał nam następującą komendę:
:(){ :|:&};:
która po wprowadzeniu całkowicie zawiesza interpretator poleceń i przy okazji cały system. Moje pytanie brzmi: co właściwie robi/wywołuje ta komenda?
-
Napisałem już kilka linijek próby wyjaśnienia, ale... może to właśnie zadanie dla Ciebie, by do tego samodzielnie dojść :) A nie chciałbym robić za Ciebie zadanka domowego.
Koniecznie przestudiuj manual basha - jest po polsku. Być może polecenie działa w innych powłokach.
Podobno na taki rozrost pamięci można nałożyć ograniczenie w systemie, ale jak - nie pamiętam już.
-
Mnie dziwi tylko że można definiować funkcję, której nazwa zarezerwowana jest już dla pewnego wbudowanego polecenia.
-
Komenda została nam podana ot tak, dla zabawy na zakończenie wykładu (wykładowca stwierdził, że znalazł ją sobie w Internecie). Efekt interesujący, ale ja próbuję dociec sposobu działania.
Na razie doszedłem do takiego wniosku, nie wiem czy słusznego:
Od razu widać, że jest to funkcja o nazwie w postaci dwukropka ":". Wg. mnie wywołuje rekurencyjnie samą siebie w nieskończoność (a być może jednocześnie dwa razy się wywołuje, jeśli zawartość listy można potraktować jako potok). Ampersand oczywiście uruchamia procesy w tle.
Tak więc mamy najpierw 1 proces, potem 2, 4, 16, 32, 64.... aż do zapchania pamięci. Dobrze kombinuję?
-
Dobrze...
...poza tym, że wypisujesz ile masz uruchomionych procesów, a tego nie jesteś w stanie przewidzieć (było: stwierdzić).
-
Twój wykładowca pewnie wziął to ze starego wątku na LKML o magicznej nazwie (która wyjaśnia całe zagadnienie): forkbombing (http://lkml.org/lkml/2005/3/20/165).
W ramach konkluzji to podanego wątku, ja stale uważam, że powinno zostać to rozwiązane mechanizmem in-kernel, jak w BSD.