Unter einem Shutdown versteht man einen Mechanismus, der es erlaubt ein System kontrolliert herunter zu fahren. In einer Multitasking-Umgebung ist es nämlich eigentlich nicht mehr zulässig, den Rechner nach Gebrauch einfach abzuschalten; auch ein Rücksetzen per Reset-Taster sollte tabu sein. Vielmehr muß sichergestellt werden, daß alle Programme korrekt beendet und alle offenen Dateien korrekt geschlossen werden, bevor dem Computer der Strom abgedreht wird. Wird dies nicht beachtet, kann es durchaus zu Datenverlusten kommen.
Aus diesem Grund haben z.B. UNIX-Systeme oder der Apple Macintosh einen Shutdown-Mechanismus; ein solcher wurde auch von Atari im MultiTOS eingeführt und steht ebenfalls in MagiC (ab Version 3.0) zur Verfügung.
Aktiviert wird der Shutdown normalerweise über den Menüeintrag Datei/Ausschalten im Desktop, durch die Tastenkombination Ctrl-Alt-Del oder durch einen Auflösungswechsel. Während des Shutdown können keine Programme gestartet werden.
Querverweis: Shutdown in MultiTOS Shutdown in MagiC Shutdown beim Empfänger Shutdown beim Initiator shel_write
Unter MultiTOS müssen Programme folgendes tun, um den Shutdown Mechanismus zu unterstützen:
shel_write (mit doex = 9) ausführen, um dem AES mitzuteilen,
daß sie die Nachricht AP_TERM verstehen.
bei Empfang der AP_TERM-Nachricht terminieren oder AP_TFAIL
verschicken.
Hinweis: MultiTOS schickt die AP_TERM-Nachricht dabei nur an solche Prozesse, die explizit AP_TERM verstehen. Da derzeit kaum Programme existieren, die ein entsprechendes shel_write absetzen, würde eine solche Implementierung in MagiC nicht das gewünschte Ergebnis liefern. Daher wurde ein anderes Verfahren gewählt, bei dem die AP_TERM Nachricht an alle laufenden Applikationen verschickt wird.
Querverweis: Shutdown in MagiC shel_write Shutdown beim Empfänger Shutdown beim Initiator
Unter MagiC funktioniert der Shutdown wie folgt: alle laufenden Programme erhalten eine AP_TERM-Nachricht die signalisiert, daß sie sich beenden sollen. Sind nach einer gewissen Zeit immer noch Programme im Speicher, so gibt SHUTDOWN eine Fehlermeldung aus. In der Datei SHUTDOWN.INF können Programmnamen (ohne Suffix wie ".prg" oder ".app") angegeben werden, die unkritisch sind und nicht zu einer Fehlermeldung durch SHUTDOWN führen sollen.
Darüber hinaus sollten die folgenden Punkte beachtet werden:
Wenn das System über Ctrl-Alt-Del beenden werden soll muss
darauf geachtet werden daß der Bildschirm nicht gesperrt ist, d.h.
daß z.B. nicht gerade ein Programm eine Dialogbox oder Alertbox auf
dem Bildschirm bearbeitet. Weiterhin muß eine geeignete Shell
(MAGXDESK, Thing) geladen sein, d.h. es darf kein Programm im
"single mode" oder im Modus "Shell nicht resident"
(z.B. per Alt-Doppelklick) geladen sein.
Ist der Bildschirm gesperrt, wird nur der Writeback-Daemon
beendet, d.h. der Cache zurückgeschrieben. Erst nach Freigeben des
Bildschirms (d.h. nach Schließen der Dialogbox oder Alertbox) kann
der Shutdown durchgeführt werden.
Sollte das System derart abgestürzt sein, daß kein Shutdown
mehr möglich ist, sollte Ctrl-Alt-Del ein zweites Mal betätigt
werden. Dann wird ein Warmstart durchgeführt, ohne daß Programme
beendet werden.
Ist der "single mode" aktiv oder die Shell nicht
geladen, wird ebenfalls nur der Writeback-Daemon beendet und der Cache
zurückgeschrieben. Für den vollständigen Shutdown muß erst das
laufende Programm beendet werden so daß die Shell wieder aktiv ist.
Der Shutdown muss dann über den Menüpunkt Datei/Ausschalten
durchgeführt werden.
In MagiC 4 wurde der Shutdown Mechanismus wie folgt überarbeitet: Das AES schickt jetzt eine SHUT_COMPLETED-Nachricht mit msg[3] = 0 (d.h. 'Shutdown erfolglos beendet') und msg[4] = -1 (ungültige ap_id), wenn nur noch Programme im System sind, die nicht exlizit AP_TERM verstehen. Damit bricht ein Programm, das nur die MultiTOS-Spezifikation beherrscht, den Shutdown ab. SHUTDOWN.PRG dagegen wurde an die neue Spezifikation angepaßt, und funktioniert wie bisher, d.h. gibt den noch laufenden Programmen einen Timeout und gibt dann die Namen aller unwilligen Applikationen aus.
Darüber hinaus bekommt die Applikation #0 bei Ctrl-Alt-Del keine zufälligen Daten mehr in msg[4,5,6,7] übergeben, sondern die folgende Nachricht:
msg[3] = -1 msg[4,6,7] = 0 msg[5] = AP_TERM
Querverweis:
Shutdown in MultiTOS shel_write Shutdown beim Empfänger Shutdown beim Initiator
Zunächst sei darauf hingewiesen, daß sich der Shutdown Mechanismus in MultiTOS von dem in MagiC unterscheidet: Ataris MultiTOS verschickt eine AP_TERM-Nachricht nur an solche Applikationen, die dem AES per shel_write (Opcode 9) explizit mitgeteilt haben, daß sie die AP_TERM-Nachricht verstehen; MagiC hingegen verschickt die Nachricht an alle aktiven Applikationen.
Der Shutdown wird vom AES genau dann als erfolgreich angesehen, wenn sich alle Programme, die explizit AP_TERM verstehen, beendet haben. Sollte eine Applikation bekanntgeben daß sie sich nicht beenden kann, so wird der Shutdown abgebrochen. Aus diesen Gründen hat jedes Programm, daß eine AP_TERM Nachricht empfängt prinzipiell nur zwei Möglichkeiten:
msg[0] = AP_TFAIL; msg[1] = err; shel_write(10, 0, 0, (char *) msg, NULL);
Reagiert die Applikation hingegen anders, d.h. ignoriert sie die AP_TERM Nachricht, so hängt das Verhalten des Systems davon ab, ob mitgeteilt wurde daß die AP_TERM-Nachricht verstanden wird. Im Klartext:
Versteht die Applikation explizit AP_TERM, so geht das
System davon aus, daß die Applikation z.Zt. keine Nachrichten
empfangen kann. Der ShutDown wird nicht unterbrochen, sondern dauert
solange, bis der Aufrufer (i.a. das Programm SHUTDOWN) den Shutdown
abbricht. SHUTDOWN verwendet dazu einen Timeout von 3 Sekunden, d.h.
wenn 3 Sekunden nach Beginn des Shutdown noch Programme aktiv sind,
die AP_TERM verstehen, bricht das Programm den Shutdown-Prozeß ab.
Versteht die Applikation nicht explizit AP_TERM, meldet
das System dem Initiator des Shutdown (i.a. SHUTDOWN.PRG) den
erfolgreichen Abschluß des Shutdown-Vorgangs. Nur weil SHUTDOWN.PRG
so nachsichtig mit alten Programmen ist, testet es, ob noch
Applikationen aktiv sind, und gibt ggf. eine Meldung aus. Dabei kann
man in SHUTDOWN.INF Programme angeben, die nicht zu einer Fehlermeldung
führen sollen, d.h. die nicht beendet zu werden brauchen.
Hinweis: Wurde der Shutdown per Alternate-Control-Delete ausgelöst, so bekommen zunächst nur der Writeback-Daemon und die Applikation mit ID 0 eine AP_TERM-Nachricht. Als Absender ist dabei -1 eingetragen. Die Applikation 0 (i.a. der Desktop) beendet sich dann und startet das Shutdown-Programm.
Querverweis:
Shutdown beim Initiator shel_write Shutdown in MultiTOS Shutdown in MagiC
Shutdown und Auflösungswechsel werden in MagiC von dem Programm SHUTDOWN übernommen, das mit den folgenden Parametern aufgerufen wird:
SHUTDOWN.PRG dev txt
Dabei ist dev = -1, wenn ein Shutdown ohne Auflösungswechsel durchgeführt werden soll, ansonsten die Gerätenummer des VDI-Bildschirmtreibers. txt ist die Texthöhe für das AES; diese sollte i.a. Null sein.
Ein Shutdown wird per ret = shel_write(4, TRUE, 0, NULL, NULL) gestartet. Dabei signalisiert ein Rückgabewert von 0, daß ein Shutdown nicht möglich ist, weil z.B. bereits ein Shutdown läuft. Ein Auflösungswechsel wird mit ret = shel_write(5, dev, 0, NULL, NULL) durchgeführt. Dabei ist dev der VDI-Gerätetreiber. Alternativ kann mit shel_write(5, xdv, 1, NULL, NULL) in xdv ein Falcon-Auflösungsmodus angegeben werden.
Diese Aufrufe sind alle MultiTOS-konform. Zusätzlich existiert ab MagiC 3 noch folgender Aufruf: ret = shel_write(5, dev, 100+txt, NULL, NULL). Hiermit kann man die Texthöhe für das AES festlegen. Eine Falcon-Auflösung kann man bei diesem Modus nicht übergeben, dev ist also die Gerätenummer des VDI-Bildschirmtreibers.
Die Gerätenummer hängt vom verwendeten System und VDI ab. Bei einem nackten ST oder TT (ohne Grafikkarte) gilt die folgende Zuordung:
1 | Default-Auflösung | |
2 | ST niedrig | (320*200*16) |
3 | ST mittel | (640*200*4) |
4 | ST hoch | (640*400*2) |
6 | TT mittel | (640*480*16) |
8 | TT hoch | (1280*960*2) |
9 | TT niedrig | (320*480*256) |
Bei Einsatz einer Grafikkarte oder auf einem Macintosh stehen die Gerätenummern wie üblich in der ASSIGN.SYS-Datei im Wurzelverzeichnis des Bootlaufwerks.
Nach erfolgreichem shel_write-Aufruf befindet sich das System im Shutdown-Modus, und es können keine Programme mehr gestartet werden. Nach einem erfolgreichen Abschluß des Shutdown oder Auflösungswechsels erhält der Initiator folgende Nachricht:
msg[0] = | SHUT_COMPLETED |
msg[3] = | 1 - Shutdown erfolgreich |
bzw. beim Auflösungswechsel
msg[0] = | RESCH_COMPLETED |
msg[3] = | 1 - Auflösungswechsel erfolgreich |
Erfolgreich heißt für das System, daß alle Programme, die explizit AP_TERM verstehen, sich beendet haben. Soll der Shutdown trotzdem abgebrochen werden, so kann dies per ret = shel_write(4, FALSE, 0, NULL, NULL) erfolgen. Andernfalls wird der Auflösungswechsel endgültig durchgeführt, wenn sich der Initiator beendet hat. Der Shutdown dagegen wird abgebrochen, wenn der Initiator terminiert.
Hat ein Programm per AP_TFAIL den Shutdown verweigert, so erhält der Initiator die folgende Nachricht.
msg[0] = | SHUT_COMPLETED |
msg[3] = | 0 - Shutdown abgebrochen |
msg[4] = | ap_id der Applikation, die verweigert hat |
msg[5] = | Fehlercode dieser Applikation |
bzw. beim Auflösungswechsel
msg[0] = | RESCH_COMPLETED |
msg[3] = | 0 - Auflösungswechsel abgebrochen |
msg[4] = | ap_id der Applikation, die verweigert hat |
msg[5] = | Fehlercode dieser Applikation |
Das System hat in diesem Fall den Shutdown bzw. Auflösungswechsel schon beendet, d.h. der Initiator kann nichts mehr tun.
Hinweis: Weil es vorkommen kann, daß der Shutdown-Prozeß niemals vom System als abgeschlossen oder abgebrochen gemeldet wird (die RESCH_COMPLETED bzw. SHUT_COMPLETED-Nachricht also niemals verschickt wird), sollte der Initiator beim Warten auf die Nachricht einen Timeout vorsehen. Tritt dieser Fall ein, muß der Shutdown explizit abgebrochen werden. Per appl_search kann der Initiator testen, ob noch Programme aktiv sind, die nicht explizit AP_TERM verstehen.
Querverweis:
Shutdown beim Empfänger shel_write Shutdown in MultiTOS Shutdown in MagiC