Die Skriptsprache Perl (5) Wolfgang Friebel DESY Zeuthen
Anmerkungen zu Teil 4 select zum Umschalten des aktuellen Streams $oldfh=select(STDERR); $|=1; select($oldfh); oder use IO::Handle; STDERR->autoflush(1); n select zum Warten auf einen bereiten Stream ruft Äquivalent zum System call select n Lesen eines Zeichens (auch Return!) ohne Return use Term::ReadKey; ReadMode 4; # Turn off controls keys while(not defined($key=ReadKey(-1))) {#get key} print "Get key $key\n"; ReadMode 0;
7. Prozesse und Signale n Hier behandelte Themen nur eingeschränkt für NT n Prozesse mit `...` und system schon besprochen n Prozeßkontrolle u.a. mit exec, fork, wait, kill, alarm n Benutzung erfordert korrekte Signalbehandlung n Interprozeßkommunikation (IPC) wird unterstützt u typisch für Client Server -> CPAN Module n Prozeß+Systeminteraktion gefährden Sicherheit u Überwachung mit taint checks (perl -T)
Signalbehandlung Liste bekannter Signale sind keys von %SIG __WARN__ und __DIE__ von perl definiert n Meiste Signale führen zum Abbruch der Skript Verhindern durch Funktionsname in $SIG{signal} u Funktion wird bei Auftreten des Signals ausgeführt sleep n wird durch SIGALARM vorzeitig beendet alarm n sendet Signal ALARM nach n Sekunden kill SIGNAL, pids sendet Signal an Prozesse u kill 0 liefert wahr, wenn pid vorhanden, tut sonst nix
fork und exec n fork erzeugt Kopie des eigenen Prozesses u fortan laufen 2 Prozesse statt 1 u Unterscheidung Kind/Elternprozeß durch Returnwert u Kind gibt 0, Elternprozeß gibt pid der Kopie zurück n exec verwandelt einen Prozeß in anderen Prozeß u von exec gibt es keine Rückkehr n Elternprozeß muß auf Ende des Kindes warten u wird mit wait oder waitpid realisiert u bei Unterlassung entstehen Zombies!!
Interprozeßkommunikation n Sehr komplexe Materie mit vielen Fehlerquellen n Kommunikation über F gemeinsamen Speicher (shared memory) F bidirektionale Pipes F Sockets (netzwerkfähige Pipes) n Beispiele in Perl Cookbook n Aber: meist sofort nutzbare Module auf CPAN n Überwiegend eingesetzt: Sockets
Socket-Kommunikation n Hauptsächlich für Client/Server Aufgaben benutzt n RPC::PlServer von CPAN verwenden u Vorteile: remote procedure calls unterstützt u Läuft sowohl auf NT als auch unter UNIX u Sicherheitsmechanismen eingebaut n In Zeuthen installiert
Unsichere Daten n Über Userinput, Aufrufparameter und Output externer Programme kommen Daten ins Programm n Perl bietet Kontrolle über diese tainted data (-T): Keine Wirkung von befleckten Daten auf externe Prozesse n Insbesondere CGI-Programme sollten mit -T laufen n Setuid/gid Perl Scripts laufen immer im -T Modus n Keine Garantie für Sicherheit im perl Code
Behandlung unsicherer Daten $line = <>; #tainted `echo $line`; #insecure, gibt Fehler mit -T n Entfernung des tainted-Status durch Verwendung von Regex Substrings $1, $2,... Setzen der Variablen $ENV{PATH}, $ENV{ENV},... exec prog, args statt exec prog args (mit 2. Form args noch durch shell modifizierbar) u Verwandlung einer unsicheren Pipe in ein sicheres exec: open IP, -| or exec echo, $tainted; statt open IP, $tainted|;
File locking n Perl bietet zwei Mechanismen: flock und fcntl n flock funktioniert nicht mit NFS n fcntl ist nicht auf allen Systemen installiert n Systeme mit fcntl nicht immer kompatibel besser alternative Mechanismen benutzen Gefahr: einige Programme beachten Alternative nicht n Empfehlung: wann immer möglich vermeiden
8. Fehler in Programmen n Vermeidung von Fehlern durch perl -w #Bug in perl: -w ist optional use strict; u Benutzung von CPAN Modulen u Verwendung von Beispielen aus Literatur (s.Teil 1) Teste zur Laufzeit (Rückkehrcodes etc., $?, $! ) n Abfangen von Fehlern zur Laufzeit Kompilierfehler mit eval string Laufzeitfehler mit eval { block }
Die Funktion eval n Argument von eval wird als Perltext betrachtet eval string Syntaxcheck zur Laufzeit eval { block } Syntaxcheck beim Kompilieren n Rückgabewert wie bei Subroutinen n Bei Laufzeitfehler kein Programmabbruch u dann Rückgabewert Null und enthält die Fehlermeldung sonst ist Null n Ähnlich zu try und catch aus C++
Fehlersuche Einfachste Methode: print benutzen n komfortables Drucken der Werte von Variablen mit use Dumpvalue; my $dumper = new Dumpvalue; $dumper->dumpValue($variable); $dumper->dumpvars('main'); #alle Variablen Tracing möglich, wenn Debugging einkompiliert (- D ) n Benutzung eines Debuggers (perl -d, ddd, ptkdb)
Perl Debugger ddd und ptkdb sind grafische Frontents für perl -d n emacs bietet ebenfalls Debug Unterstützung n ddd ist in Zeuthen installiert, ptkdb nicht Zum Ausprobieren von perl Befehlen: perl -de 0 n Wichtigste Debuggerbefehle (meist 1 Zeichen) h (help) n (next) s (step) t (trace mode) b (setze breakpoint) c (cont after break) p expr (print) x expr (extended print) q (quit)
Perl Optimierung n Regel 1: Dont optimize n Erstellung eines Ausführungsprofils perl -d:Dprof perlscript erzeugt profil dprofpp gibt Profilinfos aus n Benchmarking von Codestücken use Benchmark; $t = timethis($count, CODE); Info in Objekt $t enthalten, wird auch ausgegeben
Hausaufgaben n Schreibe ein Programm, das nur 5s auf Userinput wartet n Experimentiere nicht mit fork und exec n Schreibe Hallo World als Client/Server Programm (PlServer) n Ändere teil4.pl so, daß es mit perl -T läuft n Schreibe ein Programm, das Division durch Null abfängt Erstelle mit dumpvars eine Liste aller Programmvariablen n Wie schnell ist stat auf einigen verschiedenen Rechnern