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