Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

semop - Semaphor-Operationen durchführen

&pagelevel(4)&pagelevel

Definition

#include <sys/sem.h>

int semop(int semid, struct sembuf *sops, size_t nsops);

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:

  1. 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.

  2. 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.

  3. 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.

Returnwert

0

bei Erfolg.

 

-1

bei Fehler. errno wird gesetzt, um den Fehler anzuzeigen.

Fehler

semop() schlägt fehl, wenn gilt: 

 

E2BIG

Der Wert von nsops ist größer als der systemspezifische Maximalwert.

 

EACCES

Der Prozess hat für das auszuführende Kommando nicht die erforderlichen Zugriffsrechte (siehe Abschnitt "Fehlerbehandlung“).

 

EAGAIN

Diese Operation würde dazu führen, dass der aufrufende Prozess angehalten wird, obwohl (sem_flg & IPC_NOWAIT) ungleich 0 ist.

 

EFBIG

Der Wert von sem_num ist kleiner als 0 oder größer gleich der Anzahl von Semaphoren in der mit semid bezeichneten Semaphorenmenge.

 

EIDRM

Die Semaphorkennzahl semid wurde im System gelöscht.

 

EINTR

semop() wurde durch ein Signal unterbrochen.

 

EINVAL

Der Wert von semid ist keine gültige Semaphorkennzahl oder die Anzahl der einzelnen Semaphore, für die der aufrufende Prozess ein SEM_UNDO anfordert, würde den systemspezifischen Maximalwert überschreiten.

 

ENOSPC

Die systemspezifische Maximalanzahl von Prozessen, die SEM_UNDO anfordern dürfen, würde überschritten.

 

ERANGE

Eine Operation würde dazu führen, dass semval oder semadj den systemspezifischen Maximalwert überschreitet.

Siehe auch

exec, exit(), fork(), semctl(), semget(), sys/sem.h, Abschnitt "Interprozesskommunikation“.