next up previous contents
Next: Gniazda sieciowe - podstawy 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);
  }
  



Paweł Niewiadomski
2000-10-17