#include #include #include #include #define SEM_MODE 0666 void P (int semid) { struct sembuf sbuf; sbuf.sem_num = 0; sbuf.sem_op = -1; sbuf.sem_flg = 0; if (semop (semid, &sbuf, 1) < 0) perror ("semop P"), exit(1); return; } void V (int semid) { struct sembuf sbuf; sbuf.sem_num = 0; sbuf.sem_op = 1; sbuf.sem_flg = 0; if (semop (semid, &sbuf, 1) < 0) perror ("semop V"), exit(1); return; } // Send in unique number for semid, return value is a unique system semid. void Init (int* semid, int value) { int new_semid=0; union { int val; struct semid_ds *buf; u_short *array; } arg; //if ((new_semid = semget(new_semid,1,IPC_CREAT | SEM_MODE))<0) if ((new_semid = semget(IPC_PRIVATE,1,IPC_CREAT | SEM_MODE))<0) { perror ("semget IPC_CREAT"), exit(1); } printf("INIT: Mutex id created: %d\n", new_semid); arg.val = value; if (semctl (new_semid, 0, SETVAL, arg) < 0) perror ("semctl SETVAL"), exit(1); *semid = new_semid; return; } void Remove (int semid) { if (semctl (semid, 0, IPC_RMID) < 0) perror ("semctl SETVAL"), exit(1); return; } void Print (int semid) { int val; if ((val = semctl (semid, 0, GETVAL)) < 0) perror ("semctl GETVAL"), exit(1); printf ("Semaphore %d's value = %d\n", semid, val); return; }