Cześć,
Potrzebuje stworzyć semafor z 3 elementami, które będę mógł zajmować i zwalniać. Problem w tym, że nie wiem jak kontrolować elementy w semaforze. Zarys jest taki:
1 = zajmuje 1 element w semaforze
2 = zajmuje 2 elementy w semaforze
3 = zajmuje 3 elementy w semaforze
A, S, D odpowiednio zwalnia.
#include <stdio.h>
#include <stdbool.h>
#include <sys/sem.h>
#include <sys/ipc.h>
#include <sys/types.h>
int main()
{
key_t key = ftok(".", 'a');
int semid = semget(key, 3, IPC_CREAT | 0666);
struct sembuf lock[3] = { {0, -1, 0}, {1, -1, 0}, {2, -1, 0} };
struct sembuf unlock[3] = { {0, 1, 0}, {1, 1, 0}, (2, 1, 0) };
char input;
semctl(semid, 0, SETVAL, 1);
semctl(semid, 1, SETVAL, 1);
semctl(semid, 2, SETVAL, 1);
while(true)
{
scanf(" %c", &input);
switch(input)
{
case '1':
semop(semid, lock, 1);
printf("\nSemaphore Locked\n");
break;
case '2':
semop(semid, lock, 2);
printf("\n2 Semaphores Locked\n");
break;
case '3':
semop(semid, lock, 3);
printf("\n3 Semaphores Locked\n");
break;
case 'A':
semop(semid, unlock, 1);
printf("\nSemaphore Unlocked\n");
break;
case 'S':
semop(semid, unlock, 2);
printf("\n2 Semaphores Unlocked\n");
break;
case 'D':
semop(semid, unlock, 3);
printf("\n3 Semaphores Unlocked\n");
break;
default:
printf("\nERROR\n");
break;
}
}
semctl(semid, 0, IPC_RMID);
semctl(semid, 1, IPC_RMID);
semctl(semid, 2, IPC_RMID);
return 0;
}