Prototyp:
int semop(int id, struct sembuf *ops, int count);
Effekt:
Der Systemaufruf semop() manipuliert Semaphorwerte durch eine Gruppe von P- und V-Operationen.
Führt mindestens eine der P-Operationen zur Blockierung, so wird der Prozeß blockiert
und vorerst keine der Operationen ausgeführt.
Includes:
#include<sys/ipc.h>
#include<sys/sem.h>
#include<sys/types.h>
Parameter:
struct sembuf{ short sem_num; Gruppeninterne Nummer des Semaphors, auf dem die Operation ausgeführt werden soll. short sem_op; Auszuführende Operation: sem_op>0: addiere sem_op zum Semaphorwert und deblockiere alle wartenden Prozesse, die dann einer nach dem anderen erneut versuchen, ihre Semaphoroperation erfolgreich auszuführen. sem_op<0: falls Semaphorwert + sem_op>=0, addiere sem_op zum Semaphorwert, sonst blockiere. short sem_flg; Flag - hier uninteressant, 0 wählen }
Rückgabe:
Wert des Semaphors, auf den die letzte Semaphoroperation in ops zugreift, bevor diese Operation stattfand,
oder -1 bei Fehler.
Beispiele:
int semid1; /* Identifikatoren für Semaphorgruppe */
struct sembuf sem_p[2]; /* für P-Operationen auf den Semaphoren */
struct sembuf sem_v[2]; /* für V-Operationen auf den Semaphoren */
/* Annahme: semid1 zeigt auf eine Gruppe von zwei Semaphoren */
/* Vorbereitung der P-Operationen */
sem_p[0].sem_num = 0;
sem_p[1].sem_num = 1;
/* Setzen der Op. "Dekrementieren der Semaphorwerte" */
sem_p[0].sem_op = -2;
sem_p[1].sem_op = -1;
/* Setzen der Flags */
sem_p[0].sem_flg =sem_p[1].sem_flg = 0;
/* Vorbereitung der V-Operationen */
sem_v[0].sem_num = 0;
sem_v[1].sem_num = 1;
/* Setzen der Op. "Inkrementieren der Semaphorwerte" */
sem_v[0].sem_op = 2;
sem_v[1].sem_op = 3;
/* Setzen der Flags */
sem_v[0].sem_flg =sem_v[1].sem_flg = 0;
semop(semid1, sem_v, 1);
/* V-Operation auf ersten Semaphor */
semop(semid1, sem_v, 2);
/* V-Operation auf beide Semaphore */
semop(semid1, sem_p, 2);
/* P-Operation auf beide Semaphor */
semop(semid1, sem_p, 1);
/* P-Operation auf ersten Semaphor */
semop(semid1, &sem_v[1], 1);
/* P-Operation auf zweiten Semaphor */
Wenn Sie die Prozesse in dem unteren Feld der Graphik mit der Maus anklicken, werden die Beispiele demonstriert.