Synchronisation mit Semaphoren

Diskutiere Synchronisation mit Semaphoren im Programmieren allgemein Forum im Bereich Programmieren unter Linux/Unix; hallo habe mich daran mal versucht. vielleicht kann mirt jemand helfen. #include <sys/ipc.h> #include <sys/sem.h> int main() {...

  1. #1 peerffm, 03.05.2007
    peerffm

    peerffm Grünschnabel

    Dabei seit:
    03.05.2007
    Beiträge:
    5
    Zustimmungen:
    0
    hallo habe mich daran mal versucht.

    vielleicht kann mirt jemand helfen.


    Code:
    
    #include <sys/ipc.h>
    #include <sys/sem.h>
    
    
    int main()
    {
    int semID;
    struct sembuf sema;
    
    
    
    //erzeuge des semaphoren
        semID = semget(25112, 1, IPC_CREAT | 0777);
        if (semID >= 0) {
            puts("Semaphore erzeugt.....");
            getchar();
    //bereite vor und starte
            sema.sem_num = 0;
            sema.sem_flg = IPC_NOWAIT;
            sema.sem_op  = -1;
            if (-1==semop(semID, &sema, 1)) {
                
                perror("semop");
            }
            puts("huhu bin im kritischen Bereich");
            getchar();
            sema.sem_op  = 1;
            if (-1==semop(semID, &sema, 1)) {
                
                perror("semop");
            }
            puts("und nun wieder weg");
        } else {
            perror("semget");
        }
    }
    
    
    
    
    bekomme folgende ausgabe:
    Semaphore erzeugt

    semop: Ressource temporarily unavaible

    huhu bin im kritischen bereich

    und nun wieder weg

    irgendwie funktioniert das nicht wenn ich mehrere Terminal Fenster öffne und es starte müsste er ja wenn ich mit dem einem im Kritischen Bereich bin denn anderen Blockieren.

    und wieso bekomme ich die obere fehlermeldung.

    kann mir da jemand helfen ? danke


    peer
     
  2. Anzeige

    Anzeige

    Wenn du mehr über Linux erfahren möchtest, dann solltest du dir mal folgende Shellkommandos anschauen.


    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 heidler, 04.05.2007
    heidler

    heidler Foren As

    Dabei seit:
    03.03.2006
    Beiträge:
    94
    Zustimmungen:
    0
    Vielleicht hilft diese Abfrage:
    Code:
    if ((semid = semget(25112, 1, 0666 | IPC_CREAT)) == -1) {
                perror("semget");
                exit(1);
            }
    
    Ich bin auch Neuling in diesem Gebiet.
    Vielleicht hilft dir der link:
    http://www.pronix.de/pronix-219.html

    Tschö
     
  4. #3 SkydiverBS, 04.05.2007
    Zuletzt bearbeitet: 05.05.2007
    SkydiverBS

    SkydiverBS Tripel-As

    Dabei seit:
    15.01.2005
    Beiträge:
    207
    Zustimmungen:
    0
    Ort:
    Freising
    Hallo!

    Der Link zum Openbook "Linux-Unix-Programmierung" ist ein guter Tipp und man kann eigentlich auf den Fehler kommen, wenn man der Beschreibung dort folgt:

    1. Die Initialisierung der Semaphore fehlt. Nach dem
    Code:
    semID = semget(25112, 1, IPC_CREAT | 0777);
    musst du die Semaphore mit einem Wert (z.B. 1) belegen:
    Code:
    /* Semaphor mit 1 initialisieren */
    if (semctl (semid, 0, SETVAL, (int) 1) == -1) {
        perror("semctl");
    }
    
    Ansonsten kann
    Code:
    sema.sem_num = 0;
    sema.sem_flg = IPC_NOWAIT;
    sema.sem_op  = -1;
    if (-1==semop(semID, &sema, 1)) {
        perror("semop");
    }
    
    nicht funktionieren, da der Wert der Semaphore nicht weiter erniedrigt werden kann.

    2. Du musst außerdem prüfen ob die Semaphore schon existiert wenn du das Programm mehrmals startest, denn sonst initialisiert jeder Prozess die Semaphore mit einem positiven Wert und kommt somit in den kritischen Bereich.

    Eine Möglichkeit wäre, die IF-Abfrage nach dem semget so umzustellen wie schon von heidler empfohlen und beim semget zusätzlich zu dem Flag IPC_CREAT noch IPC_EXCL anzugeben. Dann gibt semget auch -1 zurück wenn die Semaphore existiert und du könntest in der IF-Abfrage die Variable errno auf den Wert EEXIST prüfen (siehe semget manpage). In dem Fall das die Semaphore schon existiert müsstest du nur semget noch mal ohne IPC_CREAT und ohne IPC_EXCEL aufrufen um sie zu öffnen.

    Beispiel:
    Code:
    /* Erzeuge Semaphor */
    semID = semget(25112, 1, IPC_CREAT | IPC_EXCL | 0777);
    if (semID == -1) {
        if (errno == EEXIST) {
            /* Öffne Semaphor */
            semID = semget(25112, 1, 0777);
            if (semID == -1) {
                perror("semget");
                exit(1);
            }
        }
        else {
            perror("semget");
            exit(1);
        }
    }
    else {
        /* Semaphor mit 1 initialisieren */
        if (semctl (semid, 0, SETVAL, (int) 1) == -1) {
            perror("semctl");
        }
    }
    
    Etwas übersichtlicher wird der Code wenn du dir Funktionen für das Erzeugen und Initialisieren der Semaphore und evtl. auch für die Operationen erhöhen und erniedrigen schreibst. Beispiele dazu gibts auch im Buch.

    Gruß,
    Philip
     
  5. #4 Mr.Trent, 12.06.2007
    Zuletzt von einem Moderator bearbeitet: 12.06.2007
    Mr.Trent

    Mr.Trent Guest

    Hi,
    wenn ich die sem_op = 0 setze und die semaphore mit dem wert 1 initialisiere
    und dann folgedes ausführe;

    Code:
    struct sembuf op1  = {0, 0, 0};
    struct sembuf op2 = {0, -1, 0};
    int sema, kind1, kind2;
    sema = semget(IPC_PRIVATE, 0, IPC_CREAT | 0777);
    semctl(sema, 0, SETVAL, 1);
    
    if((kind1 = fork()) == 0)
    {
      semop(sema, 0, &op1, 1); //kind1 wartet weil semaphore den wert 1 hat
      exit(0);
    }
    
    if((kind2 = fork()) == 0)
    {
      
      semop(sema, 0, &op2, 1);//kind2 läuft 
      exit(0);
    }
    kind 1 wuerde doch erst dann weiterlaufen, wenn die semaphore den wert 0 hat, oder?
    kennst sich jemand mit der operation "sem_op = 0;" aus?
     
  6. #5 SkydiverBS, 28.06.2007
    SkydiverBS

    SkydiverBS Tripel-As

    Dabei seit:
    15.01.2005
    Beiträge:
    207
    Zustimmungen:
    0
    Ort:
    Freising
    Korrekt. So steht es auch in der semop Manpage:
    Gruß,
    Philip
     
Thema:

Synchronisation mit Semaphoren

Die Seite wird geladen...

Synchronisation mit Semaphoren - Ähnliche Themen

  1. Synchronisation-Fenster bei Windows unter einer PDC

    Synchronisation-Fenster bei Windows unter einer PDC: Hallo, wenn ich mich mit einem Benutzer aus der PDC abmelde, erscheint von Windows ein Synchronisation-Fenster in welchem aber immer nur immer...
  2. Handysynchronisation Thunderbird/Lightning zu Nokia 5230

    Handysynchronisation Thunderbird/Lightning zu Nokia 5230: Hallo, ich suche eine Möglichkeit unter Ubuntu (oder notfalls auch Windows) meine Kalenderdaten und Adressbücher von Thunderbird/Lightning in...
  3. Ubuntu 12.04 LTS Datensynchronisation mit Windows7 Dateifreigabe

    Ubuntu 12.04 LTS Datensynchronisation mit Windows7 Dateifreigabe: Hallo, ich würde gerne wissen, ob es ein Programm für Ubuntu 12.04 LTS x86 gibt, mit dem ich Daten von meinem Ubuntu Rechner mit den Daten auf...
  4. Datensynchronisation

    Datensynchronisation: Guten Abend, mich Interessiert grade wie ihr die Problematik der Datensyncronisation mit mehreren Rechnern gelöst habt. Ich verwende hierzu...
  5. Rsync-Befehl für Synchronisation zwischen Notebook und Desktop

    Rsync-Befehl für Synchronisation zwischen Notebook und Desktop: Hi, Wollte ich eigentlich schon länger machen, habs aber immerwieder verschoben. Also ich suche eine Lösung mit rsync, bei der: -nur auf dem...
  1. Diese Seite verwendet Cookies um Inhalte zu personalisieren. Außerdem werden auch Cookies von Diensten Dritter gesetzt. Mit dem weiteren Aufenthalt akzeptierst du diesen Einsatz von Cookies.
    Information ausblenden