Frage zum anlegen von 2 Semaphoren ?



  • Hallo,
    beschäftige mich gerade mit Semaphoren. Hab dazu einige schöne Beispiele bei dem eine Semaphore angelegt wird. Was mir jedoch fehlt sind Beispiele bei denen 2 odere mehrere Semaphoren angelegt werden. Hab hier ein kleines Beispielprogramm von pronix im Anhang gelegt. Mir ist prinzipiell schon klar was zu tun ist, allerdings nicht wie man das elegant ohne viel Code erledigt. Ich müßte ja warscheinlich eine zweite semid Variable anlegen, einen neuen KEY erfinden und die init_semaphore Funktion umschreiben ? Aber das muss doch irgendwie eleganter gehen ? Wäre nett wenn mal jemand anhand des Beispiels demonstrieren könnte wie man eine 2 Semaphore anlegt, was damit in main() gemacht wird sei jetzt mal unwichtig.

    Grüße Cassis.

    /* sem.c */
    #include <stdio.h>
    #include <unistd.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <sys/ipc.h>
    #include <sys/sem.h>
    #define LOCK       -1
    #define UNLOCK      1
    #define PERM 0666      /* Zugriffsrechte */
    #define KEY  123458L
    
    static struct sembuf semaphore;
    static int semid;
    
    static int init_semaphore (void) {
       /* Testen ob das Semaphor bereits existiert */
       semid = semget (KEY, 0, IPC_PRIVATE);
       if (semid < 0) {
          /* ... existiert noch nicht also anlegen */
          /* Alle Zugriffsrechte der Dateikreierungsmaske erlauben */
          umask(0);
          semid = semget (KEY, 1, IPC_CREAT | IPC_EXCL | PERM);
          if (semid < 0) {
             printf ("Fehler beim Anlegen des Semaphors ...\n");
             return -1;
          }
          printf ("(angelegt) Semaphor-ID : %d\n", semid);
          /* Semaphor mit 1 initialisieren */
          if (semctl (semid, 0, SETVAL, (int) 1) == -1)
             return -1;
       }
       return 1;
    }
    
    static int semaphore_operation (int op) {
       semaphore.sem_op = op;
       semaphore.sem_flg = SEM_UNDO;
       if( semop (semid, &semaphore, 1) == -1) {
          perror(" semop ");
          exit (EXIT_FAILURE);
       }
       return 1;
    }
    
    int main (void) {
       int res;
    
       res = init_semaphore ();
       if (res < 0)
          return EXIT_FAILURE;
    
       printf ("Vor dem kritischen Codeausschnitt ...\n");
       semaphore_operation ( LOCK );
       /* Kritischer Codeausschnitt */
       printf ("PID %d verwendet Semaphor %d\n",
          getpid(), semid);
       printf ("Im kritischen Codeabschnitt ...\n");
       sleep (10);
       semaphore_operation ( UNLOCK );
       printf ("Nach dem kritischen Codeaussschnitt ...\n");
       //semctl (semid, 0, IPC_RMID, 0);
       return EXIT_SUCCESS;
    }
    

Log in to reply