Center for Biotechnology Bielefeld Bioinformatics Service Netzwerk - Programmierung Kommunikation von Prozessen Signale und Pipes Alexander Sczyrba Jan Krüger
Center for Biotechnology Bielefeld Bioinformatics Service Kommunikation von Prozessen Parent und Child Prozesse koennen kommunizieren über ● Signale ● Pipes ● Shared Memory
Center for Biotechnology Bielefeld Bioinformatics Service Signale ● Technik um Nachrichten an Prozesse zu schicken ● z.B. erzeugt division by zero das Signal SIGFPE ● Prozesse haben 3 Möglichkeiten Signale zu verarbeiten : 1.Ignorieren 2.Default-Aktion ausführen (SIGFPE → Terminierung) 3.Bereitstellung einer Funktio, die für das entsprechende Signal aufgerufen wird (Signalhandler)
Center for Biotechnology Bielefeld Bioinformatics Service POSIX Signale (Ausschnitt) T: terminate, C: continue, ! : can't be caught, R: resume, S : stop, C :core dump
Center for Biotechnology Bielefeld Bioinformatics Service kill() Perl-Skript kann anderem Prozess mit Hilfe von kill() ein Signal senden : $count = kill ● Sendet Signal $signal an einen oder mehrere Prozesse ● Signal kann numerisch oder symbolisch festgelegt werden Liste eines oder mehrere Prozesse ● Rückgabe: Anzahl der Prozesse an die das Signal erfolgreich versandt wurde
Center for Biotechnology Bielefeld Bioinformatics Service Abfangen von Signalen ● Zufügen eines Signalhandlers zu globalen Hash %SIG ● Name des Signal als Hash-Key (z.B. $SIG{INT}) ● Wert ist eine Referenz auf eine Subroutine ● Beachte : keine aufwendigen Funktionen in Signalhandlern
Center for Biotechnology Bielefeld Bioinformatics Service Aufgabe(n) 1.Schreibe ein Skript, das endlos alle 5 Sekunden „I'm sleeping.“ ausgibt. 2.Wie kann das Skript terminiert werden ? 3.Erweitere das Skript so das das INT Signal abgefangen wird. Das Program soll nach dem 3. INT Signal terminieren.
Center for Biotechnology Bielefeld Bioinformatics Service Pipes ● ursprüngliche Form von Unix Interprocess Communication (IPC) [1973] ● nützlich für viele Operationen ● Nachteil: haben keinen Namen, können daher nur durch verwandte Prozesse genutzt werden ● wurde später [1983] durch Einführung von FIFOs (named pipes) korrigiert ● Pipes und FIFOs werden durch die normalen read und write Funktionen angesprochen
Center for Biotechnology Bielefeld Bioinformatics Service Lesen aus einer Pipe my %who; # accumulate logins open (WHOFH,"who |") or die "Can’t open who: $!"; while ( ) { next unless /(\S+)/; $who{$1}++; } foreach (sort { $who{$b} $who{$a} } keys %who) { printf "%10s %d\n",$_,$who{$_}; } close WHOFH or die "Close error: $!";
Center for Biotechnology Bielefeld Bioinformatics Service Schreiben in eine Pipe open(WC,"| wc -lw") or die "cannot open wordcount: $!"; print WC "This is the first line\n"; print WC "This is another line\n"; print WC "This is the last line\n"; print WC "Oops. I lied\n"; close WC;
Center for Biotechnology Bielefeld Bioinformatics Service pipe() $result = pipe (READHANDLE, WRITEHANDLE); ● Öffnet ein Paar von Filehandles, die durch eine Pipe verbunden sind pipe WH RHRH process kernel process
Center for Biotechnology Bielefeld Bioinformatics Service pipe() ● Wird normallerweise in Verbindung mit fork() benutzt ● Parent läßt eine Filehandle offen und schließt das andere ● Child verfährt umgekehrt pipe WH RHRH process kernel WH RHRH parentchild fork()
Center for Biotechnology Bielefeld Bioinformatics Service pipe() ● Wird normallerweise in Verbindung mit fork() benutzt ● Parent läßt eine Filehandle offen und schließt das andere ● Child verfährt umgekehrt pipe WH RHRH process kernel WH RHRH parentchild fork()
Center for Biotechnology Bielefeld Bioinformatics Service Aufgabe Schreibe ein Skript, das 1.eine Pipe öffnet 2.ein Child forked 3.eine Nachricht vom Parent an das Child schickt … 4.… und diese im Child ausgibt pipe WH RHRH process kernel WH RHRH parentchild fork()
Center for Biotechnology Bielefeld Bioinformatics Service Bidirektionale Pipes ● Pipes, die wir bis jetzt kenngelernt haben sind half-duplex oder unidirectional ● ermöglicht Kommunikation in eine Richtung ● wenn Daten in beide Richtungen fließen sollen, dann müssen zwei Pipes erzeugt werden, eine für jede Richtung
Center for Biotechnology Bielefeld Bioinformatics Service Aufgabe Schreibe ein Skript, das ein Child forked und in dem Parent und Child in beide Richtungen kommunizieren können. 1.erzeuge zwei pipes 2.fork 3.Parent schließt Reader von Pipe1 4.Parent schließt Writer von Pipe2 5.Child schließt Writer von Pipe1 6.Child schließt Reader von Pipe2
Center for Biotechnology Bielefeld Bioinformatics Service Aufgabe pipe WH RHRH process kernel WH RHRH parent child fork() pipe