Next: 7 Sound Programming Up: shmtool: An interactive shared Previous: Examples

#### The Source

    #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();

             /* Create unique key via call to ftok() */
             key = ftok(".", 'S');

             /* Open the shared memory segment - create if necessary */
             if((shmid = shmget(key, SEGSIZE, IPC_CREAT|IPC_EXCL|0666)) == -1)
             {
                     printf("Shared memory segment exists - opening as client\n");

                     /* Segment probably already exists - try as a client */
                     if((shmid = shmget(key, SEGSIZE, 0)) == -1)
                     {
                             perror("shmget");
                             exit(1);
                     }
             }
             else
             {
                     printf("Creating new shared memory segment\n");
             }

             /* Attach (map) the shared memory segment into the current process */
             if((segptr = shmat(shmid, 0, 0)) == -1)
             {
                     perror("shmat");
                     exit(1);
             }

             switch(tolower(argv[1][0]))
             {
                     case 'w': writeshm(shmid, segptr, argv[2]);
                               break;
                     case 'r': readshm(shmid, segptr);
                               break;
                     case 'd': removeshm(shmid);
                               break;
                     case 'm': changemode(shmid, argv[2]);
                               break;
                      default: usage();

             }
     }

     writeshm(int shmid, char *segptr, char *text)
     {
             strcpy(segptr, text);
             printf("Done...\n");
     }

     readshm(int shmid, char *segptr)
     {
             printf("segptr: %s\n", segptr);
     }

     removeshm(int shmid)
     {
             shmctl(shmid, IPC_RMID, 0);
             printf("Shared memory segment marked for deletion\n");
     }

     changemode(int shmid, char *mode)
     {
             struct shmid_ds myshmds;

             /* Get current values for internal data structure */
             shmctl(shmid, IPC_STAT, &myshmds);

             /* Display old permissions */
             printf("Old permissions were: %o\n", myshmds.shm_perm.mode);

             /* Convert and load the mode */
             sscanf(mode, "%o", &myshmds.shm_perm.mode);

             /* Update the mode */
             shmctl(shmid, IPC_SET, &myshmds);

             printf("New permissions are : %o\n", myshmds.shm_perm.mode);
     }

     usage()
     {
             fprintf(stderr, "shmtool - A utility for tinkering with shared memory\n");
             fprintf(stderr, "\nUSAGE:  shmtool (w)rite <text>\n");
             fprintf(stderr, "                (r)ead\n");
             fprintf(stderr, "                (d)elete\n");
             fprintf(stderr, "                (m)ode change <octal mode>\n");
             exit(1);
     }