next up previous contents
Next: 6.4.4 Shared Memory Up: 6.4.3 Semaphores Previous: The Source

semstat: A semtool companion program

As an added bonus, the source code to a companion program called semstat is provided next. The semstat program displays the values of each of the semaphores in the set created by semtool.


/*****************************************************************************
  Excerpt from "Linux Programmer's Guide - Chapter 6"
  (C)opyright 1994-1995, Scott Burkett
  ***************************************************************************** 
  MODULE: semstat.c
  *****************************************************************************
  A companion command line tool for the semtool package.  semstat displays
  the current value of all semaphores in the set created by semtool.
  *****************************************************************************/
 
 #include <stdio.h>
 #include <stdlib.h>
 #include <sys/types.h>
 #include <sys/ipc.h>
 #include <sys/sem.h>
 
 int get_sem_count(int sid);
 void show_sem_usage(int sid);
 int get_sem_count(int sid);
 void dispval(int sid);
 
 int main(int argc, char *argv[])
 {
         key_t key;
         int   semset_id;
 
         /* Create unique key via call to ftok() */
         key = ftok(".", 's');
 
         /* Open the semaphore set - do not create! */
         if((semset_id = semget(key, 1, 0666)) == -1) 
         {
                 printf("Semaphore set does not exist\n");
                 exit(1);
         }
 
         show_sem_usage(semset_id); 
         return(0);
 }
 
 void show_sem_usage(int sid)
 {
         int cntr=0, maxsems, semval;
 
         maxsems = get_sem_count(sid);
 
         while(cntr < maxsems) {
                 semval = semctl(sid, cntr, GETVAL, 0);
                 printf("Semaphore #%d:  --> %d\n", cntr, semval);
                 cntr++;
         }
 }
 
 int get_sem_count(int sid)
 {
         int rc;
         struct semid_ds mysemds;
         union semun semopts;
 
         /* Get current values for internal data structure */
         semopts.buf = &mysemds;
 
         if((rc = semctl(sid, 0, IPC_STAT, semopts)) == -1) {
                 perror("semctl");
                 exit(1);
         }
 
         /* return number of semaphores in set */
         return(semopts.buf->sem_nsems);
 }
 
 void dispval(int sid)
 {
         int semval;
 
         semval = semctl(sid, 0, GETVAL, 0);
         printf("semval is %d\n", semval);
 }



Converted on:
Fri Mar 29 14:43:04 EST 1996