Museum

Home

Lab Overview

Retrotechnology Articles

Online Manuals

⇒ trap(1) — Reliant UNIX 5.44c4

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

exit(1)

kill(1)

ksh(1)

sh(1)

signal(5)

trap(1)                                                             trap(1)

NAME
     trap - Signalbehandlung ändern

SYNTAX
     trap[ kommandoliste] signalnummer ...                         Format 1

     trap                                                          Format 2

BESCHREIBUNG
     Mit dem in die Shell sh(1) bzw. ksh(1) eingebauten Kommando trap kön-
     nen Sie vereinbaren, wie die aktuelle Shell auf zukünftig eintreffende
     Signale reagieren soll. In Shell-Prozeduren können Sie auf diese Weise
     festlegen, welche "Aufräumarbeiten" vor dem Abbruch erledigt werden
     sollen oder an welcher Stelle keine Unterbrechung stattfinden darf.
     trap hat zwei Funktionen:

     ⊕  trap legt fest, wie die Shell auf ein Signal reagieren soll (Format
        1):

        -  Die Shell führt die beim Aufruf von trap angegebenen Kommandos
           aus.

           Wenn diese Kommandos ausgeführt sind, wird aber das eventuell
           abgebrochene Kommando nicht nochmals gestartet. Shell-Prozeduren
           werden mit dem Kommando fortgesetzt, das dem unterbrochenen
           folgt.

        -  Die Shell ignoriert das angegebene Signal.

        -  Die Shell reagiert auf das angegebene Signal wieder standardmä-
           ßig. Sie können mit trap die Signalbehandlung wieder auf den
           Standard zurücksetzen.

     ⊕  trap gibt die Signale aus, für die sich in der aktuellen Shell die
        Behandlung geändert hat (Format 2).

   Format 1: Signalbehandlung ändern

     trap[ kommandoliste] signalnummer ...

     kommandoliste
          legt fest, wie die Shell auf die nachfolgend angegebenen Signale
          reagieren soll, ob sie also

          -  Kommandos ausführen soll, wenn das angegebene Signal ein-
             trifft,

          -  das angegebene Signal ignorieren soll, oder

          -  auf das angegebene Signal wieder standardmäßig reagieren soll.





Seite 1                      Reliant UNIX 5.44               Gedruckt 11/98

trap(1)                                                             trap(1)

          Kommandos ausführen

          Für kommandoliste geben Sie ein oder mehrere Kommandos (z. B.
          trap pwd 2) an. Diese Kommandos sollen ausgeführt werden, wenn
          das angegebene Signal eintrifft. Mehrere Kommandos trennen Sie
          durch Strichpunkte voneinander. Den Strichpunkt müssen Sie für
          die Shell entwerten.

          Die Kommandoliste muß ein einziges Argument sein. Sobald in die-
          ser Liste Argument-Trennzeichen oder Strichpunkte enthalten sind,
          müssen Sie kommandoliste in Hochkommas '...' bzw. Anführungszei-
          chen "..." einschließen.

          Wenn die angegebene kommandoliste nicht die leere Zeichenkette
          ist, gilt die so vereinbarte Signalbehandlung nur in der aktuel-
          len Shell. In jeder Subshell muß diese mit trap neu vereinbart
          werden; andernfalls gilt die Standard-Behandlung.

          Beachten Sie dabei, daß die Shell die angegebenen Kommandos zwei-
          mal interpretiert:

          -  Das erste Mal, wenn die Shell trap ausführt.

          -  Das zweite Mal, wenn das entsprechende Signal eintrifft und
             die Shell die vereinbarten Kommandos ausführt.

          Deshalb haben Hochkommas und Anführungszeichen unterschiedliche
          Bedeutung:

          'kommandoliste'
               Die Shell interpretiert die Sonderzeichen erst bei der Aus-
               führung der Kommandos. Shell-Variablen werden also erst bei
               der Ausführung durch ihren Wert ersetzt.

          "kommandoliste"
               Die Shell interpretiert die Zeichen $, \ und `...` bereits
               beim Ausführen von trap. Oft sind aber zu diesem Zeitpunkt
               Shell-Variablen noch nicht definiert.

          Wenn Sie verhindern wollen, daß die Shell-Prozedur nach dem Ein-
          treffen eines Signals weiter ausgeführt wird, geben Sie exit als
          letztes Kommando in der Kommandoliste an.

          Signal ignorieren

          Die Angabe "" oder '', also die leere Zeichenkette, für kommando-
          liste bedeutet, daß die angegebenen Signale ignoriert werden
          (z. B. trap "" 2).

          Die entsprechenden Signale werden auch in jeder Subshell igno-
          riert.



Seite 2                      Reliant UNIX 5.44               Gedruckt 11/98

trap(1)                                                             trap(1)

          Signalbehandlung auf den Standard zurücksetzen

          Wenn Sie kommandoliste nicht angeben (z. B. trap 2), reagiert die
          Shell auf die angegebenen Signale wieder standardmäßig.

     signalnummer
          Nummer des Signals, auf das die Shell wie angegeben reagieren
          soll [siehe signal(5)]. Sie können mehrere Signalnummern angeben,
          jeweils getrennt durch Leerzeichen. Sobald eines dieser Signale
          eintrifft, wird kommandoliste ausgeführt.

          In der Korn-Shell ksh können Sie anstelle der Signalnummern auch
          die Signalnamen angeben.

          Sinnvolle Angaben für die Shell sind:
          _________________
         |  0  |  EXIT    |
         |_____|__________|
         |  1  |  SIGHUP  |
         |_____|__________|
         |  2  |  SIGINT  |
         |_____|__________|
         |  3  |  SIGQUIT |
         |_____|__________|
         |  6  |  SIGABRT |
         |_____|__________|
         |  9  |  SIGKILL |
         |_____|__________|
         | 14  |  SIGALRM |
         |_____|__________|
         | 15  |  SIGTERM |
         |_____|__________|

          Die Angabe 0 für signalnummer bewirkt, daß die angegebene komman-
          doliste ausgeführt wird, bevor sich die aktuelle Shell beendet; 0
          ist kein Signal. Das bedeutet:

          -  Wenn Sie trap im Dialog aufgerufen haben, wird kommandoliste
             ausgeführt, sobald Sie CTRL-D drücken.

          -  Wenn trap in einer Shell-Prozedur steht, wird kommandoliste
             nach der Ausführung dieser Prozedur ausgeführt.

          Das Signal 9 (SIGKILL) führt immer zum Abbruch, daher ist trap ''
          9 wirkungslos.

          Die Angabe 11 (SIGSEGV) ist bei trap nicht erlaubt.







Seite 3                      Reliant UNIX 5.44               Gedruckt 11/98

trap(1)                                                             trap(1)

   Format 2: Geänderte Signalbehandlung ausgeben

     trap Wenn Sie trap ohne Argumente aufrufen, schreibt es die Signale
          auf die Standard-Ausgabe, für die sich in der aktuellen Shell die
          Behandlung geändert hat. Die Ausgabe hat folgendes Format:

          signalnummer: kommandoliste

          bzw. in der Korn-Shell ksh:

          trap -- kommandoliste signal

          Es werden aber nur die Signalnummern ausgegeben, für die Sie mit
          dem Kommando trap vorher eine Behandlung abweichend vom Standard
          vereinbart haben.

   Signalbehandlung in der Shell

     Ein Prozeß kann jederzeit ein Signal erhalten, das entweder er selbst,
     ein anderer Prozeß, oder der Benutzer an der Datensichtstation z. B.
     durch DEL erzeugt haben. Er kann darauf wie folgt reagieren:

     -  Er ignoriert das eintreffende Signal.

     -  Er bricht ab.

     -  Er ruft eine Funktion auf, in der dieses Signal behandelt wird.

     Für die Shell sind folgende Signale von Bedeutung:
     ______________________________________________________________________
    | Signal-|          |                                                 |
    | Nummer |  Signal  |  Ursache                                        |
    |________|__________|_________________________________________________|
    |    1   |  SIGHUP  |  Verbindung zur Datensichtstation ist unterbro- |
    |        |          |  chen                                           |
    |________|__________|_________________________________________________|
    |    2   |  SIGINT  |  Taste DEL                                      |
    |________|__________|_________________________________________________|
    |    3   |  SIGQUIT |  Tasten CTRL-\                                  |
    |________|__________|_________________________________________________|
    |    9   |  SIGKILL |  Kommando kill -9 PID; PID ist die Prozeß-Nummer|
    |        |          |  der entsprechenden Shell                       |
    |________|__________|_________________________________________________|
    |   15   |  SIGTERM |  Kommando kill -15 PID; PID ist die Prozeß-     |
    |        |          |  Nummer der entsprechenden Shell                |
    |________|__________|_________________________________________________|








Seite 4                      Reliant UNIX 5.44               Gedruckt 11/98

trap(1)                                                             trap(1)

INTERNATIONALE UMGEBUNG
     Die Umgebungsvariable LCMESSAGES bestimmt die Sprache der Meldungs-
     texte. Wenn LCMESSAGES nicht oder als leere Zeichenkette definiert
     ist, wird der Wert von LANG als Standardwert herangezogen. Ist auch
     LANG nicht oder als leere Zeichenkette definiert, verhält sich das
     System so, als wäre es nicht internationalisiert.

     Die Umgebungsvariable LCALL bestimmt die gesamte internationale Umge-
     bung. LCALL hat Vorrang vor allen anderen Umgebungsvariablen im
     Bereich der Internationalisierung.

BEISPIELE
     Beispiel 1

     In einer Shell-Prozedur soll das Signal 2 ignoriert werden. Deshalb
     enthält diese Prozedur die folgende Zeile:

     trap '' 2

     Die zwei Hochkommas, also die leere Zeichenkette, bewirken, daß das
     Signal 2 ignoriert wird. Die Shell-Prozedur kann also nicht von außen
     durch DEL oder mit kill -2 prozessnummer abgebrochen werden.

     Beispiel 2

     Das Kommando trap in einer Dialog-Shell:

     $ trap 'echo Zuletzt abgemeldet: `date` >>$HOME/logdatei' 0
     $ trap
     0, echo Zuletzt abgemeldet: `date` >>$HOME/logdatei
     $ CTRL-D
     .
     .
     .
     login: rosa
     Password:
     $ cat logdatei
     Zuletzt abgemeldet: Wed Mar 20 22:17:23 MEZ 1991

     Hier wird vereinbart, daß bei Beendigung der aktuellen Shell eine Mel-
     dung in die Datei $HOME/logdatei geschrieben werden soll. Die Komman-
     doliste muß in Hochkommas eingeschlossen sein, damit das Kommando date
     erst bei Beendigung der Shell ausgeführt wird.

     Beispiel 3

     Die Shell-Prozedur traptest zeigt, wie temporäre Dateien gelöscht wer-
     den sollten, falls Signale während des Ablaufes eintreffen. Sie ent-
     hält die folgenden Zeilen, allerdings ohne Zeilennummern:





Seite 5                      Reliant UNIX 5.44               Gedruckt 11/98

trap(1)                                                             trap(1)

     1  TMP=/usr/rtmp/$$
     2  trap "rm -f $TMP; trap 0; exit 1" 1 2 3 15
     3  trap "rm -f $TMP; exit 0" 0
     4  ls > $TMP
        .
        .
        .

     Zeile 1:

     Der Variablen TMP wird der Dateiname /usr/rtmp/$$ zugewiesen. Die
     Shell ersetzt $$ durch die Prozeß-Nummer der aktuellen Shell. Deshalb
     ist der Dateiname eindeutig.

     Zeile 2:

     Die Kommandoliste ist in Anführungszeichen eingeschlossen, weil der
     Variablen TMP bereits ein Wert zugewiesen ist. Für die Signale 1, 2, 3
     und 15 ist folgende Reaktion vereinbart: Die Datei /usr/rtmp/$$ wird
     gelöscht, die Vereinbarung für das Ende der Prozedur (0) wird rückgän-
     gig gemacht (siehe Zeile 3) und die Prozedur mit Ende-Status 1 abge-
     brochen.

     Zeile 3:

     Als einzige Signalnummer ist 0 angegeben, d. h. für das Ende der Pro-
     zedur ist vereinbart: Die Datei /usr/rtmp/$$ wird gelöscht und die
     Prozedur mit Ende-Status 0 beendet. Diese Vereinbarung muß in Zeile 2
     mit trap 0 zurückgesetzt werden, denn das Kommando exit beendet die
     Prozedur-Shell (0). Laut Vereinbarung in Zeile 3 wäre aber dann der
     Ende-Status 0.

     Zeile 4:

     Hier wird die Datei /usr/rtmp/$$ angelegt. Diese Zeile darf nicht vor
     den trap-Kommandos stehen. Wenn nämlich die Prozedur bereits unterbro-
     chen wird, bevor die Shell das erste trap-Kommando ausgeführt hat,
     würde die Datei nicht gelöscht.

     Die Kommandoliste sollte in diesem Fall mit dem Kommando exit enden,
     da sonst möglicherweise die restlichen Kommandos der Prozedur in einem
     undefinierten Zustand ausgeführt werden.

HINWEISE
     Bei der Verwendung von trap können sich Abweichungen im Verhalten
     ergeben, je nachdem, welche Shell benutzt wird. Die möglichen Abwei-
     chungen sind nicht eigens beschrieben.

SIEHE AUCH
     exit(1), kill(1), ksh(1), sh(1), signal(5).




Seite 6                      Reliant UNIX 5.44               Gedruckt 11/98

Typewritten Software • bear@typewritten.org • Edmonds, WA 98026