Beschreibung | semop() ermöglicht die automatische Ausführung einer Liste mit vom Benutzer definierten Semaphoroperationen bezogen auf die Semaphormenge mit der im Argument semid angegebenen Semaphorkennzahl.
sops zeigt auf einen benutzerdefinierten Vektor von Strukturen für Semaphoroperationen. nsops gibt die Anzahl der Strukturen im Vektor an. Jede sembuf -Struktur enthält folgende Komponenten: Datentyp | Komponentennamen | Beschreibung | short
| sem_num
| Semaphornummer | short
| sem_op
| Semaphoroperation | short
| sem_flg
| Operationsschalter | Jede mit sem_op definierte Semaphoroperation wird für das mit semid und sem_num angegebene Semaphor ausgeführt. sem_op definiert eine der folgenden drei Semaphoroperationen:
Wenn sem_op eine negative ganze Zahl ist und der aufrufende Prozess das Schreibrecht besitzt, so tritt einer der folgenden Fälle ein: Wenn semval größer oder gleich dem Absolutbetrag von sem_op ist, wird der Absolutbetrag von sem_op von semval subtrahiert. Wenn (sem_flg & SEM_UNDO ) ungleich 0 ist, wird der Absolutbetrag von sem_op zum semadj -Wert des aufrufenden Prozesses für das angegebene Semaphor addiert (siehe exit() ). Wenn semval kleiner als der Absolutbetrag von sem_op und (sem_flg & IPC_NOWAIT) ungleich 0 ist, kehrt semop() sofort zurück. Wenn semval kleiner als der Absolutbetrag von sem_op und (sem_flg & IPC_NOWAIT) gleich 0 ist, erhöht semop() den Wert von semncnt des angegebenen Semaphors um 1 und der aufrufende Prozess wird angehalten, bis eine der folgenden Bedingungen eintritt: Der Wert von semval wird größer oder gleich dem Absolutbetrag von sem_op . Wenn dies eintritt, wird der semncnt -Wert des angegebenen Semaphors um 1 vermindert, der Absolutbetrag von sem_op wird von semval subtrahiert und, wenn (sem_flg & SEM_UNDO ) ungleich 0 ist, wird der Absolutbetrag von sem_op zum semadj -Wert des aufrufenden Prozesses für das angegebene Semaphor addiert. Die Kennzahl semid , für die der aufrufende Prozess auf eine Operation wartet, wird im System gelöscht (siehe semctl() ). In diesem Fall wird errno auf EIDRM gesetzt und der Wert -1 zurückgeliefert. Der aufrufende Prozess empfängt ein abzufangendes Signal. In diesem Fall wird der semncnt -Wert des angegebenen Semaphors um 1 vermindert und der aufrufende Prozess setzt seine Ausführung in der Weise fort, wie dies bei der Funktion sigaction() beschrieben ist.
Wenn sem_op eine positive ganze Zahl ist und der aufrufende Prozess das Schreibrecht besitzt, wird der Wert von sem_op zum semval -Wert addiert, und, wenn (sem_flg & SEM_UNDO ) ungleich 0 ist, vom semadj -Wert des aufrufenden Prozesses für das angegebene Semaphor subtrahiert. Wenn sem_op gleich 0 ist und der aufrufende Prozess das Leserecht besitzt, so tritt einer der folgenden Fälle ein: Wenn semval gleich 0 ist, kehrt semop() sofort zurück. Wenn sowohl semval als auch (sem_flg & IPC_NOWAIT ) ungleich 0 sind, kehrt semop() sofort zurück. Wenn semval ungleich 0 und (sem_flg & IPC_NOWAIT ) gleich 0 sind, erhöht semop() den Wert von semzcnt des angegebenen Semaphors um 1 und der aufrufende Prozess wird angehalten, bis eines der folgenden Ereignisse eintritt: semval nimmt den Wert 0 an. Dann wird der Wert von semzcnt des angegebenen Semaphors um 1 vermindert.
Die Kennzahl semid des Semaphors, für das der aufrufende Prozess auf eine Operation wartet, wird im System gelöscht. In diesem Fall wird errno auf EIDRM gesetzt und der Wert -1 zurückgeliefert. Der aufrufende Prozess empfängt ein abzufangendes Signal. In diesem Fall wird der Wert von semzcnt des angegebenen Semaphors um 1 vermindert und der aufrufende Prozess setzt seine Ausführung in der Weise fort, wie dies bei sigaction() beschrieben ist.
Bei erfolgreicher Ausführung wird der Wert von sempid für alle in dem Vektor, auf den sops zeigt, enthaltenen Semaphore gleich der Prozessnummer des aufrufenden Prozesses gesetzt. Bei der Verwendung von Threads kommt ändert sich die Funktionalität von semop in folgenden Punkten: Durchführen von Semaphor-Operationen zu 1. Wenn semval kleiner als der Absolutbetrag von sem_op und ( sem_flg & IPC_NOWAIT ) gleich 0 ist, erhöht semop() den Wert von semncnt des angegebenen Semaphors um 1 und der aufrufende Thread wird angehalten, bis eine der folgenden Bedingungen eintritt: Der Wert von semval wird größer oder gleich dem Absolutbetrag von sem_op. Wenn dies eintritt, wird der semncnt-Wert des angegebenen Semaphors um 1 vermindert, der Absolutbetrag von sem_op wird von semval subtrahiert und wenn (sem_flg & SEM_UNDO ) ungleich 0 ist, wird der Absolutbetrag von sem_op zum semadj-Wert des aufrufenden Prozesses für das angegebene Semaphor addiert. Die Kennzahl semid, für die der aufrufende Thread auf eine Operation wartet, wird im System gelöscht. In diesem Fall wird errno auf EIDRM gesetzt und der Wert -1 zurückgeliefert. Der aufrufende Thread empfängt ein abzufangendes Signal. In diesem Fall wird der semncnt-Wert des angegebenen Semaphors um 1 vermindert und der aufrufende Thread setzt seine Ausführung in der Weise fort, wie dies bei der Funktion ssigaction() beschrieben ist.
zu 3. Wenn semval ungleich 0 und (sem_flg & IPC_NOWAIT ) gleich 0 sind, erhöht semop() den Wert von semzcnt des angegebenen Semaphors um 1 und der aufrufende Thread wird angehalten, bis eines der folgenden Ereignisse eintritt: semval nimmt den Wert 0 an. Dann wird der Wert von semzcnt des angegebenen Semaphors um 1 vermindert. Die Kennzahl semid des Semaphors, für das der aufrufende Thread auf eine Operation wartet, wird im System gelöscht. In diesem Fall wird errno auf EIDRM g gesetzt und der Wert -1 zurückgeliefert.
Der aufrufende Thread empfängt ein abzufangendes Signal. In diesem Fall wird der Wert von semzcnt des angegebenen Semaphors um 1 vermindert und der aufrufende Thread setzt seine Ausführung in der Weise fort, wie dies bei sigaction() beschrieben ist. |