Problem mit Semaphore



  • Hallo,

    in folgendem Code möchte ich einfach den Umgang mit Semaphoren näher kennenlernen. Allerdings funktioniert es nicht so, wie ich dachte.

    Es scheint so, als ob semop() blockiert, da die nächste Zeile nicht ausgegeben wird. Aber warum?

    Das Programm kann man einfach kopieren, wer es testen möchte.

    #include <sys/ipc.h>
    #include <sys/sem.h>
    
    int main(int argc, char **argv)
    {
    int semID;
    struct sembuf sema;
    
    /* Semaphore erzeugen */
        semID = semget(1111, 1, IPC_CREAT | 0666);
        if(semID >= 0) {
    
            puts("Semaphore. Vor Anfrage\n");
          getchar();
    
            /* Bereite die Semaphore vor und starte */
            sema.sem_num = 0;
            sema.sem_flg = SEM_UNDO;
            sema.sem_op  = -1;
    
            semop(semID, &sema, 1);
    
          puts("bin im kritischen Bereich\n");
    
            getchar();
            sema.sem_op  = 1;
    
            semop(semID, &sema, 1);
    
            puts("und nun wieder draußen\n");
        }
       else {
            perror("semget");
        }
    }
    


  • *schieb ... wegen 0 Aufrufe



  • deetee schrieb:

    *schieb ... wegen 0 Aufrufe

    Hier hat jeder Beitrag 0 Aufrufe. Der Zähler wurde abgeschaltet.



  • wo initialisiert du den die semaphore? soweit ich mich entsinne muss man der angelegten semaphore erst mal einen wert zuweisen (also den internen "zähler" setzen).
    das wird über die funktion semctl gemacht. falls man das nicht macht und die semaphore initial den wert 0 hat (keine ahnung was da drin steht) ist schon klar warum der prozess blockiert.



  • @offtopic
    stimmt...alles klar.

    @Psycho
    danke, werde das mal probieren.



  • Daran lag es Psycho, vielen dank.

    Diese Zeile muss in den if Block rein:

    semctl(semID, 0, SETVAL, 1);


Anmelden zum Antworten