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.11.20 Psemaphore TOS Name: »Psemaphore« - erzeugen, anwenden, zerstören einer Semaphore. Gemdosnummer: 308 Deklaration: int32_t Psemaphore ( int16_t mode, int32_t id, int32_t timeout ); Beschreibung: Die Funktion implementiert nicht-zählende Semaphore. Nur ein Prozess kann einen Semaphor zur gleichen Zeit besitzen. Semaphoren können z.B. benutzt werden, um den Zugriff auf Datenstrukturen im Shared Memory von unterschiedlichen Teilprozessen zu synchronisieren: So muß ein Teilprozess, bevor er auf den Speicher zugreift, versuchen, in den Besitzt des Semaphors zu kommen. Dieser kann z.B. bei der Initialisierung erzeugt, und bei Programmende wieder entfernt werden. Semaphore werden durch einen Namen identifiziert. Dieser Name ist ein Langwort, das auch vier ASCII- Zeichen enthalten kann. Semaphore, deren Namen mit dem Unterstrich '_' beginnen sind dabei für das Betriebssystem reserviert. Der Parameter timeout wird nur im Modus 2 benutzt. Es gilt dabei die folgende Belegung: timeout = 0: sofort zurückkehren = -1: kein Timeout (Forever). Andere Werte für timeout geben die Wartezeit in Millisekunden an, bevor ein Timeout eintritt. Für den Parameter mode sind folgende Werte möglich: mode Bedeutung 0 Semaphore mit Kennung id erzeugen (und besitzen). 1 Semaphore mit Kennung id entfernen. Dies klappt nur, wenn der Aufrufer die Semaphore besitzt. 2 Besitz der Semaphore mit Kennung id beantragen. Dies blockiert den Aufrufer bis die Semaphore frei wird, oder ein Timeout eintritt. 3 Semaphore mit Kennung id freigeben. Dies klappt nur, wenn der Aufrufer die Semaphore besitzt. Hinweis: Wenn ein Prozess eine Semaphore erzeugt, besitzt er sie auch sofort. Damit andere Prozesse diese nutzen können, muß sie zunächst freigegeben werden. Da für das Erzeugen einer Semphore interner Speicher angefordert werden muss, sollte die Funktion sparsam verwendet werden. Wenn ein blockierter Prozess auf eine Semaphore wartet (bevor der Timeout eintritt), und ein anderer Prozess entfernt die Semaphore, dann kehrt die Funktion Psemaphore mit der Meldung ERANGE zurück, da die angeforderte Semaphore nicht länger existiert. Wenn ein Prozess terminiert, werden alle Semaphore die er besitzt, automatisch freigegeben (aber nicht zerstört). Der Besitz einer Semaphore kann nicht vererbt werden (etwa mit Pfork). Wenn ein Prozess eine Semaphore erzeugt und dann abstürzt, bleibt die Semaphore erhalten, und kann nicht mehr entfernt werden. In MagiC sorgen Plausibilitätsüberprüfungen dafür, daß keine System-Semaphoren freigegeben werden können; außerdem werden z.Zt. nur die Modi 2 und 3 unterstützt. Ergebnis: Die Funktion kann folgende Rückgabewerte liefern: E_OK : kein Fehler aufgetreten. ERROR : es wurde eine Semaphore beantragt, die der Antragsteller bereits besitzt. EACCDN: es wurde versucht eine Semaphore zu erzeugen, die bereits existiert, der Aufrufer ist nicht im Besitz der Semaphore oder ein Timeout ist eingetreten. ERANGE: der angegebene Semaphor existiert nicht. Verfügbar: Verfügbar, wenn ein 'MiNT' Cookie mit einer Versionsnummer von mindestens 0.92 existiert und in MagiC ab Version 3.0. Gruppe: Prozessfunktionen Querverweis: Binding Semaphoren in MagiC