next up previous contents
Next: Programowanie dĽwięku Up: shmtool: interaktywny manipulator segmentem Previous: Przykłady   Contents

¬ródło


   #include <stdio.h>
   #include <sys/types.h>
   #include <sys/ipc.h>
   #include <sys/shm.h>
   
   #define SEGSIZE 100
   
   main(int argc, char *argv[])
   {
           key_t key;
           int   shmid, cntr;
           char  *segptr;
   
           if(argc == 1)
                   usage();
   
           /* utwórz unikalny klucz poprzez wywołanie ftok() */
           key = ftok(".", 'S');
   
           /* otwórz segment pamięci dzielonej - utwórz jeżeli trzeba */
           if((shmid = shmget(key, SEGSIZE, IPC_CREAT|IPC_EXCL|0666)) == -1) 
           {
                   printf("Segment pamięci dzielonej istnieje - otwieram jako klient");
   
                   /* Segment prawdopodobnie istnieje - próbuję otworzyć jako klient */
                   if((shmid = shmget(key, SEGSIZE, 0)) == -1) 
                   {
                           perror("shmget");
                           exit(1);
                   }
           }
           else
           {
                   printf("Tworzenie nowego segmentu pamięci dzielonej\n");
           }
   
           /* Podł±cz ( mapuj ) segment pamięci dzielonej do tego procesu */
           if((segptr = shmat(shmid, 0, 0)) == -1)
           {
                   perror("shmat");
                   exit(1);
           }
           
           switch(tolower(argv[1][0]))
           {
                   case 'z': writeshm(shmid, segptr, argv[2]);
                             break;
                   case 'o': readshm(shmid, segptr);
                             break;
                   case 'u': removeshm(shmid);
                             break;
                   case 't': changemode(shmid, argv[2]);
                             break;
                    default: usage();
   
           }
   }
   
   writeshm(int shmid, char *segptr, char *text)
   {
           strcpy(segptr, text);
           printf("Zrobiono...\n");
   }
   
   readshm(int shmid, char *segptr)
   {
           printf("segptr: %s\n", segptr);
   }
   
   removeshm(int shmid)
   {
           shmctl(shmid, IPC_RMID, 0);
           printf("Segment pamięci dzielonej ustawiony do usunięcia\n");
   }
   
   changemode(int shmid, char *mode) 
   {
           struct shmid_ds myshmds;
   
           /* pobierz aktualne warto¶ci wewnętrznej struktury danych */
           shmctl(shmid, IPC_STAT, &myshmds);
   
           /* wy¶wietl stare prawa dostępu */
           printf("Stare prawa dostępu: %o\n", myshmds.shm_perm.mode);
   
           /* konwertuj i załaduj prawa dostępu */ 
           sscanf(mode, "%o", &myshmds.shm_perm.mode);
   
           /* aktualizuj tryb */
           shmctl(shmid, IPC_SET, &myshmds);
   
           printf("Nowe prawa dostępu : %o\n", myshmds.shm_perm.mode);
   }
   
   usage()
   {
           fprintf(stderr, "shmtool - narzędzie do majstrowania segmentem pamięci dzielonej\n");
           fprintf(stderr, "\nUŻYCIE:  shmtool (z)apisz <text>\n");
           fprintf(stderr, "                 (o)dczytaj\n");
           fprintf(stderr, "                 (u)suń\n");
           fprintf(stderr, "                 (t)ryb <tryb ósemkowo>\n");
           exit(1);
   }
   




2000-03-01


Poltronic