Semaphoren (semget, semop, semctl)

T

terrorgfx

Grünschnabel
Hoi!

Hab ein Referat über Semaphoren geschrieben ... da stimmt aber einiges nicht.

Weil ich selber keine Ahnung von dem ganze habe und auf Quellen im Inet angewiesen bin, weiß ich nicht, wie ich die Mängel des Referats beheben kann (zumindest können mir die angesurften Seite keina Antworten auf meine Fragen liefern).

Und zwar (Kleine Auszüge aus dem Referat):

Mit dem semop()-Befehl wird die Semaphore selbst bearbeitet
Code:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>

int semop(int semid, struct sembuf sem_array[], size_t n_op);

Folgende Argumente werden beim semop()-Befehl übergeben:
- semid: die ID der Semaphore, die man bei semget() erhalten hat
- sem_array[]: die Adresse eines Arrays von der Struktur sembuf, die je eine Semaphorenoperation beschreiben
- n_op: gibt an, wie viele Elemente in dem Array (2. Parameter) stehen

sembuf beinhaltet folgende Felder:
Code:
struct sembuf {
    short sem_num;  /* semaphore number: 0 = first */
    short sem_op;   /* semaphore operation */
    short sem_flg;  /* operation flags */
};

Bei sem_op hab ich jetzt folgendes stehen:

sem_op: bestimmt die Operation selbst. Folgendes ist möglich:
- semop > 0: Der Wert der Semaphore wird um den Wert, den semop hat, erhöht. Diese Operation blockiert nie
- semop < 0: Der Wert der Semaphore wird um den Wert von semop verringert.
Wird die Semaphore durch diese Operation negativ, wird der kritische Bereich gesperrt.
Versucht nun ein anderer Prozess, darauf zuzugreifen, hängt die Reaktion von dem sem_flag ab.
Wurde IPC_NOWAIT gesetzt, bricht semop() mit einem Fehler ab, ansonsten wartet der Prozess, bis die Ressource wieder freigegeben ist.
- semop == 0: ist der Wert der Semaphore semval Null, dann läuft die Operation einfach durch. Ansonsten blockiert dieser Prozess und wartet, bis das Semaphor Null wird.

Anscheinend stimmen die Beschreibungen für
semop == 0
und semop > 0 nicht ... !

Weitere Frage die der Lehrer fragt:
Was passiert, wenn bei semop nur ein Teil der sembuf-Spezifikationen erfüllt werden kann?

Und noch weiter:
Was ist nun key wirklich?

Meine Beschreibung wäre gewesen:
Der Key ist quasi die „magische Nummer“, also eine Zahl, die von den Programmen vereinbart wird, die über die Semaphore kommunizieren wollen.

Reicht aber anscheinend nicht aus ...

Irgend jemand hier im Forum, der sich da besser auskennt und meine Fragen beantworten kann?
 
Wiki hab ich durchgeschaut, gibt aber nicht wirklich was her.

Galileo-Computing auch ... das blöde is, dass manche Beschreibungen ausführlicher/kürzer sind und die sich tlw. widersprechen (glaub ich ^^).

Aber Galileo-Computing beantwortet leider meine Fragen wegen dem sembuf und dem Key nicht ... denn die Beschreibungen, die da verwendet werden, hab ich ja schon im Referat drin...
 
Hi,

also in meinem Linux Kernel Buch von R. Love hab ich gar nichts von den semop, semget... gelesen. Da geht es im Allgemeinen lediglich um die Anwendung von Semaphoren, Mutex (binäre Semaphore) zur Synchronisation, die auch Schlafen darf und Spin Locks, die nur in der Top Half eines Interrut Handler eingesetzt werden sollen. (Kann das Buch nur Empfehlen). Aber genug der Vorrede:

Hier mal noch ein paar Links, die dir vlt. etwas weiter helfen:
http://www.linux-magazin.de/Artikel/ausgabe/1999/03/System/system9.html
http://www.opengroup.org/onlinepubs/009695399/functions/semop.html
http://www.opengroup.org/onlinepubs/009695399/functions/semctl.html

Hast du "nur" Semaphoren behandelt oder auch so Sachen wie den BLK (Big Kernel Lock).

Edit:

Da es so wie immer ist, denke ich das der Kernel die beste Doku dafür ist.
Ich glaube, dass du schon mal nen Blick in die Datei $KERNEL_SOURCE/ipc/sem.c hattest.
Da wird das Ganze auch noch ein bissl "erklärt".

Da aber Semaphopen vor einigen Jahren von dem Herrn Dijkstra erarbeitet wurden, könntest du mal schauen, ob du da noch etwas zuordnen kannst.

MfG
 
Zuletzt bearbeitet:
Hi,

ich wuerd mal in einer Uni-Bibliothek in Buecher ueber Betriebssysteme gucken...

Andrea
 
Herzlichen Dank für eure Hilfe!

Hab mittlerweile herausgefunden, was der key wirklich is ... und was ihm beim semop() gefehlt hat ...
 
Für alle die es noch wissen wollen:

Code:
/* Get unique key for semaphore. */
if ((semkey = ftok("/tmp", 'a')) == (key_t) -1) {
    perror("IPC error: ftok"); exit(1);
}

und jetzt ist die Frage was ist :
Code:
ftok("/tmp", 'a')

The ftok() function shall return a key based on path and id that is usable in subsequent calls to msgget(), semget(), and shmget(). The application shall ensure that the path argument is the pathname of an existing file that the process is able to stat().

The ftok() function shall return the same key value for all paths that name the same file, when called with the same id value, and return different key values when called with different id values or with paths that name different files existing on the same file system at the same time. It is unspecified whether ftok() shall return the same key value when called again after the file named by path is removed and recreated with the same name.

Only the low-order 8-bits of id are significant. The behavior of ftok() is unspecified if these bits are 0.

Also unsere Semaphore kann eindeutig identifiziert werden.

Für die semop() operation ist der Link oben interessant. Wenn ich das richtig verstanden habe, dann wird je nach gesetztem oder fehlendem Wert eine andere operation ausgeführt.

MfG manne
 
Falls jemand Interesse hat, habe ich mal meine Realisierung eines Mutexes mit Hilfe von Semaphore angehängt. Das Ding rennt recht stabil! Bei Fragen oder Bugs stehe ich gerne zur Verfügung!

mfg hex
 

Anhänge

  • mutex.zip
    1 KB · Aufrufe: 19

Ähnliche Themen

Unix Webserver mit HTML Seite erstellen

Prozesskommunikation mit PIPES - wie funktioniert das?

sem_open - Problem mit Semaphoren

Synchronisation mit Semaphoren

Mit awk ein textfile parsen und SQL daraus erzeugen.

Zurück
Oben