Hinweis: Wenn Sie diesen Text sehen, benutzen Sie einen Browser, der nicht die gängigen Web-Standards unterstützt. Deshalb wird das Design von Medien Kunst Netz nicht korrekt dargestellt. Die Inhalte selbst sind dennoch abrufbar. Für größtmöglichen Komfort und volle Funktionalität verwenden Sie bitte die empfohlenen Browser. |
Matthias Weiß
»Zur Mikroanalyse der Forkbomb«
1 #!/usr/bin/perl -w
2 use strict;
3 die "Please do not run this script without reading the documentation" if not @ARGV;
4 my $strength = $ARGV[0] + 1;
5 while (not fork) {
6 exit unless --$strength;
7 print "0";
8 twist: while (fork) {
9 exit unless --$strength;
10 print "1";
11 }
12 }
13 goto 'twist' if --$strength;
In der ersten Zeile weisen ›#!‹-Zeichen und Pfad, die ›hash-bang‹ oder ›shebang‹ genannt werden, die Shell-Oberfläche, mit der man auf UNIX-Systemen interagiert, an, das Perl-Programm für die Ausführung des Codes zu nehmen.1 Diese Zeilen werden nicht vom Interpreter, also Perl, ausgeführt, sondern vermitteln dem Betriebssystem lediglich, dass die Textdatei, in welcher der Code steht, für den Interpreter Perl bestimmt ist. Die Zeichen dahinter definieren den Standardpfad von Perl. Das ›-w‹ am Ende weist den Interpreter an, Fehlermeldungen auszugeben. Dies wird in der Regel dann eingesetzt, wenn neu geschriebene Programme getestet werden. ›strict‹ ist ein Befehl, ein Pragma, das den Interpreter anweist, Fehlermeldungen zu generieren, wenn ein Programm unsicher programmiert wurde.
Das Skript selber ist nun keines, das wie eine Textverarbeitung einfach mit einem Doppelklick auf ein Symbol gestartet werden kann, so wie es unter dem ikonischen Paradigma grafischer Nutzeroberflächen zum Regelfall wurde. Vielmehr startet man es über eine Kommandozeile und spezifiziert dabei einen ganzzahligen Wert, der an das Programm als ›Stärke‹ der ›Bombe‹ vermittelt wird.2 Dieser spezielle Wert muss angegeben werden, sonst erscheint der Satz »Please do not run this script without reading the documentation«, und das Programm bricht ab. Die Routine ›die‹ veranlasst das System hierzu. Wenn der Wert, der über einen sogenannten Spezialarray3 ›@ARGV‹, als Argument an die Kommandozeile weiter gegeben wurde, gleich 0 ist, quittiert das Programm den Dienst kommentarlos.
Ist auf der Kommandozeile ein Wert in Form einer positiven oder negativen Ganzzahl spezifiziert, wird die Fehlermeldung übersprungen und der Code, der danach folgt, ausgeführt. In der vierten Zeile wird die Variable ›strength‹ deklariert und definiert, die mit ›my‹ ausgezeichnet werden muss, da das ›strict‹-Pragma den Programmierer hier zu besonderer Exaktheit zwingt. Damit kann das System sofort falsche Deklarationen erkennen. Der Wert von ›strength‹ ergibt sich aus dem Input von der Kommandozeile, für den demgemäß die Spezialvariable ($ARGV) steht. Dabei wird der Wert, zu dem sich der Benutzer entschieden hat, mit 1 addiert (Zeile 4). Bis zu diesem Zeitpunkt hat das Programm sich entweder mit der obigen Aufforderung, die Dokumentation zu lesen, verabschiedet, oder aber die Stärke der Bombe mit 1 addiert.
Nun kommt der eigentliche Teil, indem die Fork-Prozesse initiiert werden. Der Modifikator ›while‹ eröffnet eine Schleife genau dann, wenn die Bedingung in der nachfolgenden runden Klammer (not fork) nicht wahr ist. Die fork-Anweisung löst ungeachtet dessen den ersten Forkprozess aus.4 Meldet das System ›not fork = wahr‹, geht das Programm in die erste Schleife. Hier stoppt (›exit‹, Zeile 6) das Programm, wenn durch den Vorgang des ›Dekrementierens‹, der durch ›--‹ angegeben wird, die Variable ›strength‹ gleich 0 ist. Dann wird über die Standardausgabe eine 0 ausgegeben (Zeile 7). Danach macht das Programm weiter mit der Abarbeitung ab Zeile 8.
Zurück in Zeile 5: Meldet das System Erfolg, ist ›(not fork)‹ falsch und das Programm springt in Zeile 13 (›goto […]‹). An dieser Stelle wird ein Sprung in Zeile 8 angewiesen. Hier wird eine weitere ›fork‹ gestartet. Meldet das System ›falsch‹ zurück, springt das Programm wieder zu Zeile 13. Bei ›wahr‹ stoppt das Programm wieder, wenn durch den Vorgang des ›Dekrementierens‹, der durch ›--‹ angegeben wird, die Variable ›strength‹ gleich 0 ist (Zeilen 9, 10).
Andernfalls gibt das Programm die Ziffer 1 auf der Ausgabe aus und geht weiter in Zeile 13, und die Schleife wird so lange durchlaufen, bis alle Prozesse durch das Dekrementieren auf Null gesetzt sind. Dieser Fall tritt aber nur ein, wenn auf der Kommandozeile ein positiver Wert eingegeben wurde. In jedem Fall führt ein negativer Wert zu keiner Beendigung des Programms. Dies gilt auch für den Lauf des Programms, wenn die erste Schleife durchlaufen wurde und ›strength‹ (Zeile 6) nicht gleich 0 ist. Diese Prozesse laufen mit den Relationen der im Programm beschriebenen Bedingungen zueinander und der je zufälligen Dynamiken, welche die Effekte der Ausgabe 0 oder 1 bewirken, in jedem – metaphorisch gesprochen – Kindprozess identisch ab.5 Allgemeiner bedeutet dies, dass durch das Skript eine Kaskade von Schleifen initiiert wird, welche zwar einer programmierten Logik folgen, jedoch das System selbst mittels immanenter Logik zweckentfremden. Wird das Programm gestartet, sieht man auf der Standardausgabe, das ist heute in der Regel der Bildschirm, eine Folge von Nullen und/oder Einsen, woran zu erkennen ist, welcher Bereich der ›while‹-Konstruktion gerade abgearbeitet wurde.6 Sukzessive erlahmt der Computer. Dabei ist die Ausgabe immer eine andere.7
Die Software kann auch als Zufallsgenerator interpretiert werden.8 Jedoch erfüllt er hier nicht die Funktion, wie er sie beispielsweise in der Arbeit von Nees inne hatte. Allerdings kann das Programm auch als Projektor für die Endlichkeit des Computers entgegen der Zuschreibung durch die Wirtschaft verstanden werden, welche in der Werbung die Maschine als grenzenlos in Fähigkeiten und Möglichkeiten mythisiert.
1 S. [http://en.wikipedia.org/wiki/Shebang] oder Ellen Siever, Stephen Spainhour, Perl in a Nutshell, Köln u.a. 1999, S. 31. Vielen Dank vor allem an Sascha Büttner und Christian Rabanus für die intensive Perl-Beratung, ohne welche ich die »Forkbomb« nicht hätte auslegen können. Leider bekam ich auf meine Email-Anfrage bei Alex McLean überhaupt keine Reaktion. Mit der ›#‹ können auch in Perl Einschübe des Programmierers als Kommentare eingefügt werden, die keine Auswirkungen auf die Laufzeit des Programms haben, sondern denjenigen zur Information dienen, welche den Quellcode lesen. Details unter Greg Perry, Jetzt lerne ich Programmieren, München 2002, S. 35 f.
2 ›perl forkbomb.pl 124‹ gefolgt von einem Druck auf die Entertaste würde das Programm mit der ›Stärke‹ 124 starten. S. Abb. 7 für ein Flussdiagramm des Forkprozesses.
3 Ein Array ist: »A collection of identically typed data items distinguished by their indices (or ›subscripts‹). The number of dimensions an array can have depends on the language but is usually unlimited.« S. [http://www.hyperdictionary.com/search.aspx?define=array&search.x=0&search.y=0&search=Search], und Ulrich Kaiser, C/C++, Bonn 2000, S. 152.
4 S. [http://www.cis.uni-muenchen.de/~hbosk/programmentwicklung/forking.html] für eine detailreiche Erläuterung des Forkprozesses.
5 S. nochmals Abb. 6.
6 Die Ziffern sind aber nur Fake und können gegen andere getauscht werden.
7 Bei fünf Durchläufen und einer Eingabe von 2 auf der Kommandozeile liefert beispielsweise ein Linux-System,
Kernel 2.4.21–144–Athlon mit Perl 5.8.1 die Ergebnisse 01100, 01100, 00101, 01001, 01100.
8 Für diesen Hinweis danke ich Stefan Krecher vom Chaos Computer Club ([http://www.ccc.org]), der den Output des Aufspannens vieler Threads als Erzeugung einer pseudo-zufälligen Reihenfolge von Nullen und Einsen interpretiert hat.