•  Back 
  •  GEMDOS 
  •  Index 
  •  Tree View 
  •  Cross references 
  •  Help page 
  •  Show info about hypertext 
  •  View a new file 
Topic       : TOS - das Betriebssystem
Author      : 
Version     : tos.hyp (5. März 2013)
Subject     : Programmieren/Atari
Nodes       : 3001
Index Size  : 93602
HCP-Version : 5
Compiled on : Atari
@charset    : atarist
@lang       : 
@default    : Titel
@help       : 
@options    : +g -i -s +x +zz -t4
@width      : 70
View Ref-File5.7  Signale                                                       TOS

Das aus der U*NIX-Welt stammende Signal-Konzept steht auch unter den 
Betriebssystemen MultiTOS und MagiC (ab Version 4.50) zur Verfügung. 
Signale können als natürliche Zahlen aufgefaßt werden, die einen 
bestimmten Ausnahmezustand (Exception) repräsentieren. Sie sind mit 
einem Interrupt oder einer CPU-Exception vergleichbar, mit dem 
Unterschied jedoch, daß es sich um eine reine Software-Implementation 
handelt.

Jeder Prozess besitzt:

   ∙ einen Bitvektor der wartenden Signale (pending Signals). Dieser 
     beschreibt diejenigen Signale, die noch auf ihre Bearbeitung 
     warten, weil sie z.B. gerade durch die Signalmaske gesperrt sind, 
     oder weil der Prozess in einem Zustand ist, in dem er keine 
     Signale bearbeiten kann.

   ∙ eine Signalmaske. Dieser 32bit-Wert definiert als Bitvektor 
     diejenigen Signale, die momentan gesperrt sind; wenn in diesem 
     Vektor z.B. Bit-30 gesetzt ist, ist das Signal SIGUSR2 gesperrt. 
     Die Signalmaske wird nicht nur explizit (d.h. durch 
     Systemaufrufe), sondern auch implizit durch andere Vorgänge 
     beeinflußt. Während der Abarbeitung eines Signals ist dieses z.B. 
     gesperrt, andere können jedoch noch auftreten. Nach der 
     Bearbeitung des Signals wird dieses wieder freigegeben und damit 
     evtl. eine weitere Signalbehandlung ausgelöst. Beachtet werden 
     muss, daß einige Signale (z.B. SIGKILL, SIGSTOP, SIGCONT) nicht 
     maskiert werden können.

   ∙ eine Tabelle der Form struct sigaction

Bei einem Pexec werden die Signalmaske und der pending-Wert (s.o.) des 
Child-Prozesses auf Null gesetzt. Die Komponente sa_handler der 
sigaction Struktur wird vererbt, wobei ein Wert ungleich 0 oder 1 
immer auf 0 gesetzt wird. Die Komponenten sa_mask und sa_flags der 
Struktur werden auf den Wert Null gesetzt.

Die meisten Signale können von einem Programm abgefangen, (um etwa 
beim Eintreffen eine bestimmte Routine aufzurufen) ignoriert, oder 
auch blockiert werden. Blockierte Signale werden solange nicht 
berücksichtigt, bis die Blockade wieder aufgehoben wird. Zur 
Terminologie: Man sagt, daß ein Signal zu einem Prozess geschickt 
wird, wenn die das Signal repräsentierende Exception auftritt, oder 
wenn das Signal per Pkill von einem anderen Prozess gesendet wird. Ein 
Signal wurde hingegen an einen Prozess überbracht, wenn der 
entsprechende Prozess aufwacht, und die für das Signal passenden 
Aktionen einleitet. Zu beachten ist, daß das SignalHandling nicht 
zeitlos geschieht: Zwischen dem Abschicken eines Signals, und der 
Aufnahme der dazu passenden Aktionen kann evtl. ein beträchtlicher 
Zeitraum verstreichen.

Insgesamt stehen 31 mögliche Signale (0 bis 30) zur Verfügung, denen 
aber noch nicht allen eine feste Bedeutung zugewiesen ist. Die 
folgende Liste beschreibt (soweit bekannt) alle möglichen Signale in 
der Form: Signalnummer, Name des Signals, Bedeutung des Signals für 
den empfangenden Prozess. Sofern nicht ausdrücklich anders 
beschrieben, besteht die Default Aktion beim Eintreffen eines Signals 
in der Terminierung des empfangenden Prozesses.

 Nummer Name       Bedeutung

    0   SIGNULL    Null: Dieses Signal besitzt keine Defaultaktion, da 
                   es streng genommen gar kein Signal ist. Zusammen 
                   mit Pkill kann es jedoch benutzt werden, um die 
                   Existenz eines Prozesses zu testen. Das Signal kann 
                   nicht maskiert oder abgefangen werden.
    1   SIGHUP     Hang Up: Wird normalerweise verschickt, wenn ein 
                   Terminal, mit dem ein Prozess verbunden ist, nicht 
                   mehr gültig ist. Nach Erhalt dieses Signals sollte 
                   der Prozess keine Ausgaben mehr auf das Terminal 
                   machen. In MagiC wird der VT52 das Signal 
                   verschicken, wenn ein Terminalfenster geschlossen 
                   wurde.
    2   SIGINT     Interrupt: Wird i.a. verschickt, wenn der Benutzer 
                   die Tastenkombination ^C betätigt. Dieses Signal 
                   wird von zukünftigen Versionen MagiC statt der 
                   bisherigen ^C-Behandlung benutzt.
    3   SIGQUIT    Quit: Wird i.a. verschickt, wenn der Benutzer die 
                   Tastenkombination ^\ betätigt. Das Signal soll 
                   'härter' als SIGINT sein, und wird z.Zt. noch nicht 
                   von MagiC bzw. VT52 verschickt.
    4   SIGILL     Illegal instruction: Entspricht dem gleichnamigen 
                   Exceptionvektor des 68K-Prozessors. Das Signal 
                   sollte nicht abgefangen werden. In MiNT kann das 
                   Signal abgefangen werden, d.h. der Vektor wird 
                   praktisch für jeden Prozess umgebogen. In MagiC 
                   funktioniert das jedoch z.Zt. noch nicht, so daß 
                   hier immer 8 Bomben erscheinen.
    5   SIGTRAP    Trap: Entspricht dem Exceptionvektor 'Trace' des 
                   68K-Prozessors und wird nach jeder Anweisung 
                   gesendet, wenn das System im Einzelschritt 'trace' 
                   Modus läuft. Dieses Signal sollte nur von Debuggern 
                   abgefangen werden. In MiNT kann das Signal 
                   abgefangen werden, d.h. der Vektor wird praktisch 
                   für jeden Prozess umgebogen. In MagiC funktioniert 
                   das z.Zt. jedoch noch nicht, d.h. es erscheinen 
                   immer 9 Bomben.
    6   SIGABRT    Abort: Wird normalerweise von der 
                   Bibliotheksfunktion abort() in ANSI C verwendet, 
                   und sollte nicht abgefangen werden. Dieses Signal 
                   wird nicht vom Betriebssystem selbst verschickt.
    7   SIGPRIV    Privilege Violation: Entspricht dem gleichnamigen 
                   Exceptionvektor im 68K-Prozessor, wenn ein Prozess 
                   versucht, eine Anweisung im User-Mode auszuführen, 
                   die nur im Supervisor Mode ausgeführt werden darf. 
                   Dieses Signal sollte nicht abgefangen werden; in 
                   MiNT ist dies jedoch möglich, so daß der 
                   Exceptionvektor praktisch für jeden Prozess 
                   umgebogen wird. In MagiC funktioniert das z.Zt. 
                   jedoch noch nicht, d.h. es erscheinen immer 8 
                   Bomben.
    8   SIGFPE     Floating Point Exception: Die Default-Aktion 
                   besteht darin, das Signal zu ignorieren. Es 
                   entspricht dem 68k-Execptionvektor 'Division durch 
                   Null' oder eine Floating Point Exception. Das 
                   Signal kann ignoriert oder abgefangen werden. In 
                   MiNT kann das Signal abgefangen werden, so daß der 
                   Vektor praktisch für jeden Prozess umgebogen wird. 
                   In MagiC ist dies z.Zt. noch nicht möglich.
    9   SIGKILL    Kill: Terminiert den empfangenden Prozess. Das 
                   Signal kann nicht maskiert bzw. abgefangen werden; 
                   deshalb sollte dieses Signal erst dann verschickt 
                   werden, wenn SIGTERM erfolglos war. Das Signal wird 
                   von MagiC selbst z.Zt. noch nicht verschickt.
   10   SIGBUS     Bus Error: Entspricht dem gleichnamigen 
                   Exceptionvektor des 68K-Prozessors. Das Signal 
                   sollte nicht ignoriert oder abgefangen werden. In 
                   MiNT kann das Signal abgefangen werden, d.h. der 
                   Exceptionvektor wird praktisch für jeden Prozess 
                   umgebogen; in MagiC geht das z.Zt. jedoch noch 
                   nicht, so daß immer 2 Bomben erscheinen. In MiNT 
                   werden SIGBUS, SIGSEGV und SIGPRIV beim ersten 
                   Eintreffen des Signals auf die Defaultroutine des 
                   Systems zurückgesetzt, so daß ein doppelter Bus-/ 
                   Adreß-/Privilegfehler den Prozess immer beendet.
   11   SIGSEGV    Segmentation violation: Entspricht dem 
                   Exceptionvektor 'Adressfehler' des 68K-Prozessors. 
                   Das Signal sollte nicht abgefangen oder ignoriert 
                   werden. In MiNT kann das Signal abgefangen werden, 
                   d.h. der Exceptionvektor wird praktisch für jeden 
                   Prozess umgebogen. In MagiC geht das jedoch z.Zt. 
                   noch nicht, d.h. es erscheinen immer 3 Bomben.
   12   SIGSYS     Bad System Call: Wird verschickt, wenn ein 
                   Parameter für ein Systemaufruf ungültig ist bzw. 
                   den erlaubten Wertebereich überschreitet und der 
                   Aufruf selbst keinen Fehler meldet. Wird von MagiC 
                   z.Zt. noch nicht verschickt.
   13   SIGPIPE    Pipe Error: Wird beim Versuch verschickt, in eine 
                   nicht mehr existierende Pipe zu schreiben, und kann 
                   z.B. beim Drag&Drop-Protokoll maskiert werden. 
                   Dieses Signal wird z.Zt. von MagiC noch nicht 
                   verschickt.
   14   SIGALRM    Alarm: Wird von MiNT für Talarm verwendet, und 
                   dient z.B. zum Behandeln von Time-Outs. In MagiC 
                   wird dieses Signal z.Zt. noch nicht verschickt.
   15   SIGTERM    Terminate: Standardsignal zum Beenden eines 
                   Prozesses; es wird von MiNT z.B. beim Löschen einer 
                   Programmdatei im Verzeichnis U:\PROC verschickt, 
                   von MagiC z.Zt. jedoch noch ignoriert.
   16   SIGURG     Dieses Signal ist z.Zt. noch nicht definiert.
   17   SIGSTOP    Stop: Die Default-Aktion besteht darin, den 
                   empfangenden Prozess anzuhalten. Das Signal kann 
                   nicht blockiert bzw. abgefangen werden. In MagiC 
                   werden dabei sämtliche Threads eines Prozesses 
                   angehalten. Im gestoppten Zustand gehen in MagiC 
                   keinerlei Maus- bzw. Tastaturklicks verloren; beim 
                   Fortfahren des Prozesses per SIGCONT werden die 
                   entsprechenden Nachrichten ausgewertet.
   18   SIGTSTP    Terminal Stop: Die Default-Aktion besteht darin, 
                   den empfangenden Prozess anzuhalten. Das Signal 
                   entspricht SIGSTOP, und wird i.a. vom Benutzer 
                   durch Drücken der Tastenkombination ^Z ausgelöst. 
                   Es kann nicht maskiert bzw. abgefangen werden. Das 
                   Signal wird z.Zt. noch nicht von MagiC und VT52 
                   verschickt.
   19   SIGCONT    Continue: Die Default-Aktion besteht darin, den 
                   empfangenen (und vorher durch SIGSTOP oder Pause 
                   gestoppten) Prozess wieder aufzuwecken. Obwohl das 
                   Signal nicht maskiert bzw. ignoriert werden kann, 
                   kann eine Behandlungsroutine für das Signal 
                   installiert werden. In MagiC werden sämtliche 
                   Threads aufgeweckt, die durch einen Aufruf von 
                   Pause bzw. SIGSTOP angehalten worden sind.
   20   SIGCHLD    Child Terminated: Die Default-Aktion besteht darin, 
                   das Signal zu ignorieren. Es wird sowohl beim 
                   Terminieren als auch beim Anhalten eines Prozesses 
                   an den Parent-Prozess verschickt. In MiNT kann 
                   festgelegt werden, daß dieses Signal nur beim 
                   Terminieren verschickt wird, und darüber hinaus 
                   auch festgestellt werden, welcher Child-Prozess 
                   betroffen war. Da MagiC bisher nur das wartende 
                   Pexec kennt (d.h. der Parent wartet so lange, bis 
                   der Child terminiert), gibt es das Signal hier noch 
                   nicht. Die durch shel_write erzeugten Prozesse sind 
                   keine richtigen Childs, sondern völlig unabhängige 
                   Prozesse; in diesen Fällen muss daher auf das 
                   Eintreffen der Nachricht CH_EXIT gewartet werden.
   21   SIGTTIN    Terminal Input-Error: Die Default-Aktion besteht 
                   darin, den empfangenden Prozess anzuhalten. In der 
                   Regel versucht ein Prozess von einem Terminal zu 
                   lesen, das ihm nicht gehört. Von MagiC bzw. VT52 
                   wird das Signal z.Zt. noch nicht verschickt.
   22   SIGTTOU    Terminal Output-Error: Die Default-Aktion besteht 
                   darin, den empfangenden Prozess anzuhalten. In der 
                   Regel versucht ein Prozess Ausgaben auf ein 
                   Terminal vorzunehmen, das ihm nicht gehört. Von 
                   MagiC bzw. VT52 wird das Signal z.Zt. noch nicht 
                   verschickt.
   23   SIGIO      I/O possible: Eine Ein-/Ausgabe für eine 
                   Dateikennung ist möglich.
   24   SIGXCPU    Exhaustion of CPU-Limit: Das per Psetlimit bzw. 
                   durch die erweiterten shel_write-Modi festgelegte 
                   Rechenzeit-Kontingent ist abgelaufen. Da die 
                   Begrenzung der Rechenzeit in MagiC bisher nicht 
                   implementiert ist, wird das Signal z.Zt. noch nicht 
                   verschickt.
   25   SIGXFSZ    File size limit exceeded: Wird verschickt wenn eine 
                   Datei auf eine Weise verändert wird, die die 
                   maximale Größe einer Datei, die dem Prozess erlaubt 
                   ist, überschritten wird.
   26   SIGVTALRM  Time limit expired: Wird an einen Prozess 
                   geschickt, der seine maximale CPU Zeit 
                   überschritten hat.
   27   SIGPROF    Profiling time expired: Wird an einen Prozess 
                   geschickt, um ihm mitzuteilen, daß seine maximale 
                   Profiling Zeit überschritten ist.
   28   SIGWINCH   Window-Changed: Die Default-Aktion besteht darin, 
                   das Signal zu ignorieren. Es wird normalerweise 
                   verschickt, wenn sich die Terminalgröße (d.h. die 
                   Anzahl der Zeilen bzw. Spalten) verändert hat. Ein 
                   Programm daß im Terminalfenster abläuft, kann sich 
                   nun entsprechend neu konfigurieren. Zur Ermittlung 
                   der aktuellen Fenstergröße gibt es in MiNT Fcntl- 
                   Opcodes, die in MagiC bisher jedoch noch nicht 
                   implementiert sind. Das Signal wird daher z.Zt. 
                   noch nicht von MagiC bzw. VT52 verschickt.
   29   SIGUSR1    User-Defined:
   30   SIGUSR2    User-Defined: Diese zwei Signale dürfen durch 
                   Benutzerprogramme verschickt werden. Da ein Prozess 
                   beim Empfangen dieses Signals per Default 
                   terminiert wird, sollte es nur verschickt werden, 
                   wenn der Empfänger bekannt ist.

Querverweis:
Signalhandler in MagiC   Prozessfunktionen   Beispielcode   Psigaction 
  Psignal   Pkill   Test auf Pipes