home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1992 March / Source_Code_CD-ROM_Walnut_Creek_March_1992.iso / usenet / altsrcs / 1 / 1607 / sem.c < prev   
Encoding:
C/C++ Source or Header  |  1990-12-28  |  1.4 KB  |  87 lines

  1. /* Some simple binary semaphore routines */
  2. #include <stdio.h>
  3. #include <sys/types.h>
  4. #include <sys/stat.h>
  5. #include <sys/ipc.h>
  6. #include <sys/sem.h>
  7.  
  8. /* Set a semaphore to a particular value - meant to be used before
  9.  * first lock/unlock */
  10. void
  11. sem_set( sem_id, val )
  12.     int sem_id;
  13.     int val;
  14. {
  15.     union semun arg;
  16.     extern int errno;
  17.  
  18.     arg.val = val;
  19.  
  20.     errno = 0;
  21.     semctl( sem_id, 0, SETVAL, arg );
  22.     if( errno != 0 ){
  23.         perror( "internal error, sem_set" );
  24.         exit( -1 );
  25.     }
  26. }
  27.     
  28. int
  29. new_sem()
  30. {
  31.     int sem;
  32.  
  33.     sem = semget( IPC_PRIVATE, 1, IPC_CREAT|S_IREAD|S_IWRITE );
  34.     if( sem < 0 ){
  35.         perror( "internal error, couldn't create semaphore" );
  36.         exit( -1 );
  37.     }
  38.     sem_set( sem, 1 );
  39.  
  40.     return sem;
  41. }
  42.  
  43. void
  44. lock( sem_id )
  45.     int sem_id;
  46. {
  47.     struct sembuf sembuf;
  48.  
  49.     sembuf.sem_num = 0;
  50.     sembuf.sem_op = -1;
  51.     sembuf.sem_flg = 0;
  52.  
  53.     if( semop( sem_id, &sembuf, 1 ) == -1 ){
  54.         fprintf( stderr, "internal error, lock id %d\n", sem_id );
  55.         perror( "lock error" );
  56.         exit( -1 );
  57.     }
  58. }
  59.  
  60. void
  61. unlock( sem_id )
  62.     int sem_id;
  63. {
  64.     struct sembuf sembuf;
  65.  
  66.     sembuf.sem_num = 0;
  67.     sembuf.sem_op = 1;
  68.     sembuf.sem_flg = 0;
  69.  
  70.     if( semop( sem_id, &sembuf, 1 ) == -1 ){
  71.         fprintf( stderr, "internal error, lock id %d\n", sem_id );
  72.         perror( "unlock error" );
  73.         exit( -1 );
  74.     }
  75. }
  76.  
  77. void
  78. remove_sem( sem_id )
  79.     int sem_id;
  80. {
  81.     if( sem_id == -1 )
  82.         return;
  83.  
  84.     if( semctl( sem_id, 0, IPC_RMID, NULL ) == -1 )
  85.         perror( "internal error, failed to remove semaphore" );
  86. }
  87.