IMPLEMENTATION #1:   (A  program  that uses the primitives below)

wait primitive:
                void P(int semaphore)
                 {
                     struct sembuf psembuf;
                     psembuf.sem_op = -1;
                     psembuf.sem_flg = 0;
                     psembuf.sem_num = semaphore;
                     semop(semkey,&psembuf,1);
                     return;
                  }

signal primitive:
              void V(int semaphore)
             {
                 struct sembuf vsembuf;
                 vsembuf.sem_op = 1;
                 vsembuf.sem_flg = 0;
                 vsembuf.sem_num = semaphore;
                 semop(semkey,&vsembuf,1);
                 return;
             }

IMPLEMENTATION #2:

wait primitive:
            int semwait(int semid, ushort semnum)
           {
              static struct sembuf wait_buf = {0, -1, 0};
              wait_buf.sem_num = semnum;
              return semop(semid, &wait_buf, 1);
            }

signal primitive:
          int semsignal(int semid, ushort semnum)
          {
            static struct sembuf signal_buf = {0, 1, 0};
            signal_buf.sem_num = semnum;
            return semop(semid, &signal_buf, 1);
          }