Forum Linux.pl

Programowanie => Bash, skrypty powłoki => Wątek zaczęty przez: w 2007-12-16, 22:10:19

Tytuł: Co właściwie robi ta komenda?
Wiadomość wysłana 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?
Tytuł: Co właściwie robi ta komenda?
Wiadomość wysłana przez: arctgx w 2007-12-16, 22:59:47
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ż.
Tytuł: Co właściwie robi ta komenda?
Wiadomość wysłana przez: arctgx w 2007-12-16, 23:13:46
Mnie dziwi tylko że można definiować funkcję, której nazwa zarezerwowana jest już dla pewnego wbudowanego polecenia.
Tytuł: Co właściwie robi ta komenda?
Wiadomość wysłana przez: w 2007-12-17, 00:32:50
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ę?
Tytuł: Co właściwie robi ta komenda?
Wiadomość wysłana przez: chmooreck w 2007-12-17, 07:52:07
Dobrze...

...poza tym, że wypisujesz ile masz uruchomionych procesów, a tego nie jesteś w stanie przewidzieć (było: stwierdzić).
Tytuł: Co właściwie robi ta komenda?
Wiadomość wysłana przez: difrost w 2007-12-19, 16:08:57
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.