Einf in die Betriebssysteme II praktikum/13 Seite Installieren Sie bitte mit ebs2install 13




Дата канвертавання26.04.2016
Памер19.52 Kb.

Einf. in die Betriebssysteme II Praktikum/13 Seite

Installieren Sie bitte mit ebs2install 13 die Unterlagen in Ihrem Verzeichnis ebs2.



Ziel der Praktikumstunde: Sie verstehen den Signalmechanismus von UNIX und können dies anhand der Beispiele nachvollziehen. In der Aufgabe üben Sie eine einfache Prozesserstellung und eine Synchronisation der Prozesse über Signale.

Signale


Ein als Prozess ablaufendes Programm kommuniziert mit der Umwelt über die Ein-/Ausgabe. Zusätzlich gibt es aber noch Möglichkeiten, den Ablauf eines Programms zu beeinflussen. Nötig ist dies z.B. bei von der Bedienung herbeigeführtem Programmabbruch oder bei einer Speicherschutz­verletzung des Programms.

In UNIX geschieht dies über das Senden einer an den Prozess gerichteten Nachricht (Inhalt: eine ganze Zahl 1,2,3...). Man bezeichnet diese Nachricht als Signal. Der Prozess kann auf diese Nachrichten reagieren, er kann sie ignorieren oder er kann dem Betriebssystem die Reaktion überlassen (Default).



Die Signale entstehen intern im Prozess z.B. bei Ausnahmezuständen oder durch externe Ereignisse z.B. durch Tastatureingabe. Weiterhin können sie über eine Systemfunktion kill() und ein Shellkommando kill erzeugt werden.
Einige Signale und ihre Bedeutung

Signal-Nr.

Signal

Bedeutung

Default

2

SIGINT

Interrupt, Strg-C-Taste

Exit

3

SIGQUIT

Quit-Signal

Core&Exit

4

SIGILL

ungültige Instruktion

Core&Exit

9

SIGKILL

Kill: unbedingter Prozessabbruch

Exit

11

SIGSEGV

Segmentation Fault

Core&Exit

15

SIGTERM

Voreinstellung des Killkommandos

Exit

Zwei Signalnummern sind nicht fest zugeordnet, sie können frei definiert werden: SIGUSR1 (=16) und SIGUSR2 (=17).
Erhält ein Prozess ein Signal, für das er keine andere Festlegung getroffen hat, so wird die Default-Aktion ausgeführt. (Exit = Prozessende, Core= Speicherauszug, Ignore= Ingnorieren)

Ignorieren eines Signals


Ein Prozess kann mit dem Systemaufruf signal( Signalnr., SIG_IGN); das Eintreffen eines bestimmten Signals ignorieren. SIGKILL kann nicht ignoriert werden.

Abfangen eines Signals


Ein Prozess kann mit einer eigenen Funktion (signal catcher) ein Signal selbst bearbeiten. Die Funktion wird -wie eine Interruptfunktion - asychron beim Eintreffen des Signals aufgerufen. Mit signal(Signalnr., Funktion) meldet ein Prozess die Funktion für eine Signalnummer an.

Signal-Aufrufe


  1. Der Betriebssystemkern kann Signale generieren über Hardware-Bedingungen, z.B. Adressverletzungen, ungültiger Op-Code und über Softwarebedingungen.



  2. Der Nutzer kann am Terminal über die Tastatur bestimmte Signale erzeugen, die an den Prozess gerichtet sind, der gerade im "Vordergrund" des Terminals abläuft.
    Strg-C erzeugt SIGINT, voreingestellt erzeugt Strg-\ SIGQUIT . Nach der Eingabe stty quit ^d kann SIGQUIT mit Strg-D erzeugt werden.
    stty -a zeigt die derzeitige Setzung der Interrupttasten an.

    Läuft ein Prozess im Hintergrund ab oder auf einem anderen Terminal (Fenster), kann über das kill-Kommando ein Signal errzeugt werden:


    kill [-signal] pid
    Dem Prozess pid wird das Signal signal gesendet. Voreingestellt ist SIGTERM.



  3. Ein Prozess kann über den Systemaufruf kill() ein Signal erzeugen.
    int kill( pid_t pid, int sig);
    Include: ,
    An den Prozess pid wird das Signal signal gesendet.

Bitte wenden.

Beispiele


s-exam1.c: Geben Sie vorher stty quit ^d ein! Das Programm fängt zwei Signale ab: SIGINT (==2) und SIGQUIT (==3). Wird es im Vordergrund gestartet, so können die Signale über die Tastatur erzeugt werden (Strg-C und Strg-D) oder über ein zweites Login-Fenster mit dem kill-Kommando.

Wird es im Hintergrund gestartet, müssen die Signale mit dem kill-Kommando erzeugt werden.


s-exam2.c: Das Programm ist ein Beispiel für die programmierte Signalerzeugung. Es wird ein Child-Prozess erstellt. Diesem sendet der Parent-Prozess in Zeitabständen das Signal SIGINT 5 mal und anschließend SIGQUIT.
killme.c: Das Programm sendet das SIGKILL (==9) Signal an sich selbst. Was passiert?

Aufgaben


1. Bei welcher Art von Programmen gibt es einen ähnlichen Mechanismus: Nachrichten in Form von ganzen Zahlen, programmierte Reaktion auf diese Nachrichten oder Default-Reaktion?
2. Stellen Sie fest, wie s-exam1 auf das Signal SIGTERM (==15) reagiert. Erweitern Sie s-exam1.c so, dass das Signal SIGTERM ignoriert wird, bzw. durch eine Funktion abgefangen wird.
3. Entwerfen Sie ein Programm, bei dem zwei Prozesse sich gegenseitig Signale senden und dabei jedesmal eine Zeile ausgeben. Die Zeilen werden von beiden Prozessen synchron abwechselnd ausgegeben.

Nehmen Sie dazu das Schema von s-exam2.c. Der eine Prozess ist der Parentprozess, der andere der Childprozess.

Benutzt werden die beiden Signale SIGUSR1 und SIGUSR2. Beide Signale werden mit Funktionen abgefangen: signalcatcher1() und signalcatcher2(). In den Funktionen wird eine Zeile ausgegeben und ein Signal abgesetzt: signalcatcher1 sendet SIGUSR2 an den Parentprozess, signalcatcher2 sendet SIGUSR1 an den Childprozess. Ein Problem sind die Prozessnummern, die für die kill-Funktion benötigt werden.

Überprüfen Sie Ihren Entwurf anhand der Lösung s-exam3.c.


4. Erinnern Sie sich an den Server der vergangenen Praktikumsstunde? Es war der Server, der die PUBLIC-Pipe erstellt hatte und dann Kommandos aus dieser Pipe las und zur Ausführung brachte. Wie kann dieser Server beendet werden, er läuft im Hintergrund und reagiert nicht auf Tastatureingaben. Weiteres Problem: Wenn der Server endet, soll die PUBLIC-Pipe gelöscht werden. Wie kann das realisiert werden?
5. Können Sie sich vorstellen, was sich innerhalb des Betriebssystems abspielt:

  1. bei der signal()-Funktion, bei der die Catcherfunktion angemeldet wird,

  2. beim Senden eines Signals an einen Prozess?



Lockdatei


Im Unterverzeichnis lockdatei finden Sie ein Beispiel für die Verriegelung mit einer „Lockdatei“: Ein Programm versucht eine Datei zu erstellen. Klappt es, so besitzt der Prozess das zugeordnete Betriebsmittel. Klappt es nicht, so hat ein anderer Prozess bereits das Betriebsmittel. Wichtig ist, dass die Prozesse denselben Pfadnamen verwenden.

Weitere Anwendung: Ein Programm kann feststellen, ob es zum ersten Mal als Prozess gestartet wird oder ob es bereits als Prozess läuft.

Übersetzen der Module: gcc -o lockdatei lockdatei.c belege.c

Ausführung: lockdatei &

Als Ausgabe erhalten Sie die Meldung „Lock-Datei erhalten“.

Geben Sie schnell danach wieder lockdatei ein, so erhalten Sie die Meldung „Lock-Datei nicht erhalten“.


„lockdatei“ versucht die Datei TEST.LCK zu erstellen. Gelingt dies nicht auf Anhieb, so wird es anschließend noch mehrfach versucht. Schlägt auch dies fehl, so wird die Fehlermeldung ausgegeben.




База данных защищена авторским правом ©shkola.of.by 2016
звярнуцца да адміністрацыі

    Галоўная старонка