Я довольно новичок в понятиях межпроцессного взаимодействия, поэтому мне нужна помощь, мне нужно реализовать проблему множественных производителей-потребителей, используя очереди сообщений, в которых есть процесс менеджера, который вызывает 5 производителей и 5 потребителей ( вызовите соответствующие файлы, т. е. производителя. c и потребителя. c) и, кроме того, мне нужно проверить наличие взаимоблокировок.
Я понял большую часть концепции, но мне не хватает часть, где мне нужно позвонить производителю. c и потребителю. c из процесса менеджера (то есть менеджера. c). Я реализовал свой метод, используя fork
, но это привело к ошибке сегментации, любая помощь будет очень кстати.
Вот мой код.
int main(int argc, char* argv[]){
int dpp, i;
float prob=0.2;
if(argc!=3){
printf("Please run the program with 2 arguments : <DPP_toggle (0 or 1)> <probability> \n"); //
DPP --> Deadlock Prevention Protocol
exit(1);
}
sscanf(argv[1], "%d", &dpp);
sscanf(argv[2], "%f", &prob);
semid = semget((key_t)SEMAPHORE_KEY, 7, IPC_CREAT|0666);
for(i=0; i<=6; i++){
if(semctl(semid, i, SETVAL, 1) < 0){
printf("Error in initializing semaphore");
exit(EXIT_FAILURE);
}
}
int msgid0 = msgget((key_t)MSGQ0KEY, IPC_CREAT|0666);
int msgid1 = msgget((key_t)MSGQ1KEY, IPC_CREAT|0666);
// calling producer and consumer with fork process.
pid_t pid = fork();
if(pid < 0){
perror("fork()");
return -1;
}
for(int index=0; index<NUM_PRODUCERS; index++){
if(pid > 0){
execlp("./producer", "./producer", index, MSGQ0KEY, MSGQ1KEY, (char *)0);
exit(0);
}
else{
execlp("./consumer", "./consumer", NUM_PRODUCERS+index, MSGQ0KEY, MSGQ1KEY, dpp, prob, (char*)0);
exit(0);
}
}
// detectDeadlock();
// ...
}
В форме представлены две очереди 2D-матрицы и производителя и потребителя вставьте и удалите соответственно, используя соответствующие файлы из матрицы.
Матрица будет в следующем формате:
P1 P2 P3 P4 P5 C1 C2 C3 C4 C5
Q0 : - - - - - - - - - -
Q1 : - - - - - - - - - -