C 具有3个元素的信号量

C 具有3个元素的信号量,c,process,ipc,semaphore,C,Process,Ipc,Semaphore,我需要写一个代码,这将是一个信号灯与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>

我需要写一个代码,这将是一个信号灯与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;
}
#包括
#包括
#包括
#包括
#包括
int main()
{
key_t key=ftok(“.”和“a”);
int-semid=semget(键3,IPC|u-CREAT | 0666);
结构sembuf lock[3]={{0,-1,0},{1,-1,0},{2,-1,0};
结构sembuf unlock[3]={{0,1,0},{1,1,0},(2,1,0)};
字符输入;
semctl(semid,0,SETVAL,1);
semctl(semid,1,SETVAL,1);
semctl(semid,2,SETVAL,1);
while(true)
{
scanf(“%c”,&input);
开关(输入)
{
案例“1”:
semop(semid,lock,1);
printf(“\nSemaphore已锁定\n”);
打破
案例“2”:
semop(semid,lock,2);
printf(“\n2信号量已锁定\n”);
打破
案例“3”:
semop(semid,lock,3);
printf(“\n3信号量已锁定\n”);
打破
案例“A”:
semop(semid,unlock,1);
printf(“\nSemaphore已解锁\n”);
打破
案例S:
semop(semid,unlock,2);
printf(“\n2信号量已解锁\n”);
打破
案例“D”:
semop(semid,unlock,3);
printf(“\n3信号量已解锁\n”);
打破
违约:
printf(“\n错误\n”);
打破
}
}
semctl(semid,0,IPC_RMID);
semctl(semid,1,IPC_RMID);
semctl(semid,2,IPC_RMID);
返回0;
}

如果不使用fork,进程将在semop上阻塞,无法访问scanf以获取进一步的输入。如果使用带IPC_NOWAIT的semop,则不会发生此问题,并且可以打印来自semop的返回