1. #include <stdio.h> 
  2. #include <sys/types.h> 
  3. #include <sys/sem.h> 
  4. #include <errno.h> 
  5. #define MAX_SEMAPHORES  5  
  6. int main(int argc,char *argv[])  
  7. {  
  8.    int i, ret, semid;  
  9.    unsigned short sem_array[MAX_SEMAPHORES];  
  10.    unsigned short sem_read_array[MAX_SEMAPHORES];  
  11.    
  12.    union semun   
  13. {  
  14.      int val;  
  15.      struct semid_ds *buf;  
  16.      unsigned short *array;  
  17.    } arg;  
  18.    
  19.    semid = semget( IPC_PRIVATE, MAX_SEMAPHORES,IPC_CREAT | 0666 );  
  20.    
  21.    if (semid != -1)   
  22. {   
  23.      /* Initialize the sem_array */  
  24.      for ( i = 0 ; i < MAX_SEMAPHORES ; i++ )   
  25.   {  
  26.        sem_array[i] = (unsigned short)(i+1);  
  27.      }  
  28.      /* Update the arg union with the sem_array address */  
  29.      arg.array = sem_array;  
  30.      /* Set the values of the semaphore-array */   
  31.      ret = semctl( semid, 0, SETALL, arg);  
  32.      if (ret == -1) printf("SETALL failed (%d)\n", errno);   
  33.         /* Update the arg union with another array for read */  
  34.         arg.array = sem_read_array;  
  35.         /* Read the values of the semaphore array */  
  36. ret = semctl( semid, 0, GETALL, arg );  
  37. if (ret == -1) printf("GETALL failed (%d)\n", errno);   
  38.   /* print the sem_read_array */  
  39.   for ( i = 0 ; i < MAX_SEMAPHORES ; i++ )   
  40.   {  
  41.     printf("Semaphore %d, value %d\n", i, sem_read_array[i] );  
  42.  
  43.   }  
  44.   /* Use GETVAL in a similar manner */  
  45.   for ( i = 0 ; i < MAX_SEMAPHORES ; i++ )  
  46.   {  
  47.     ret = semctl( semid, i, GETVAL );  
  48.     printf("Semaphore %d, value %d\n", i, ret );  
  49.   }  
  50.   /* Delete the semaphore */  
  51.   ret = semctl( semid, 0, IPC_RMID );  
  52. }   
  53. else   
  54.       printf("Could not allocate semaphore (%d)\n", errno);  
  55. return 0;  
  56.