Семафор с 3 элементами - PullRequest
       33

Семафор с 3 элементами

0 голосов
/ 07 ноября 2018

Мне нужно написать код, который будет составлять семафор с 3 элементами для 2 процесса. Я не хочу использовать вилки.

1 = элемент резервирования 1

2 = резервирование 2 элемента

3 = бронь 3 элемента

A = выпускает 1 элемент

S = выпускает 2 элемента

D = выпускает 3 элемента

Я не знаю, как решить проблему со столкновением элементов резервирования. Пока я написал что-то подобное:

#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;
}

1 Ответ

0 голосов
/ 07 ноября 2018

Если это сделать без разветвления, процесс будет заблокирован в semop и не сможет получить доступ к scanf для получения дальнейшего ввода. Если используется semop с IPC_NOWAIT, эта проблема не возникнет, и можно напечатать возврат из semop.

...