Jak kontrolować elementy w semaforze?

Jak kontrolować elementy w semaforze?
MD
  • Rejestracja:ponad 6 lat
  • Ostatnio:ponad 6 lat
  • Postów:1
0

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.

Kopiuj
#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;
}
edytowany 2x, ostatnio: flowCRANE
AK
Dlaczego jeden "supersemafor" a nie trzy normalne semafory??? Tak głośno myśle ...
06
Przecież ma trzy semafory, tylko stworzone w jednym pakiecie.
AK
to widocznie ja nie rozumiem pytania
AL
  • Rejestracja:prawie 11 lat
  • Ostatnio:około 3 lata
  • Postów:1493
1

Co to znaczy "elementy"? Semget tworzy Ci zestaw semaforów.
Jeżeli chcesz operować tylko na ostatnim z 3, to robisz to np. tak:
semop(semid, lock+2, 1);

AK
w moim rozumieniu nie na ostatnim, ale na wszystkich aż do ...
AL
@AnyKtokolwiek: tworzy trzy semafory, lock+2 - odwołuje się do trzeciego (pierwszy element struktury sembuf równa się dwa, numeracja od 0), trzeci argument - ile tych elementów jest w tablicy - tu jest jeden. Jakby chciał zmodyfikować sem drugi i trzeci to byłoby to tak: semop(semid, lock+1, 2). Jak 0 i 2 musiałby zmienić kolejność elementów tablicy.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.