Как позвонить нескольким производителям и потребителям, используя очереди сообщений из процесса менеджера - PullRequest
0 голосов
/ 20 апреля 2020

Я довольно новичок в понятиях межпроцессного взаимодействия, поэтому мне нужна помощь, мне нужно реализовать проблему множественных производителей-потребителей, используя очереди сообщений, в которых есть процесс менеджера, который вызывает 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 :    -   -  -  -  -  -  -  -  -  - 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...