Создать приоритетную инверсию, разветвив три дочерних процесса?

Я пытаюсь создать инверсию приоритетов путем разветвления трех дочерних процессов. Однако я не могу достичь желаемого результата. Может кто-нибудь помочь мне, где я иду не так. Это код, который я написал до сих пор. Я хочу создать этот сценарий, а затем исправить его, используя приоритетное наследование с помощью rtmutex(мьютекс в реальном времени)

#include <stdio.h>
#include <assert.h>
#include <unistd.h>
#include <stdbool.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <pthread.h>
#include <sys/resource.h>
#include <sched.h>
//structure for mutex along with shared data
typedef struct
{
  int val;
  pthread_mutex_t mutex;
} shared_data;
//initialising shared data with null
shared_data *data = NULL;
//creating shared memory
void initialise_shared(){
    //place shared data in shared memory
    int prot = PROT_READ | PROT_WRITE;
    int flags = MAP_SHARED | MAP_ANONYMOUS;
    data = mmap(NULL,sizeof(shared_data),prot,flags,-1,0);
    assert(data);
    data->val = 0;
    //initialise mutex
    pthread_mutexattr_t attr;
    pthread_mutexattr_init(&attr);
    pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED);
    pthread_mutex_init(&data->mutex, &attr);
}
//function for high and low priority process
void hlfunc(){
    pthread_mutex_lock(&data->mutex);
    data->val = 1;
    printf("\ndata : %d\n",data->val);
    pthread_mutex_unlock(&data->mutex);
}
//function for medium priority process
void mfunc(){
    printf("M\n");
}
int main(){

    initialise_shared();
    struct sched_param param;
    int high_priority,low_priority,mid_priority;
    high_priority = sched_get_priority_max(SCHED_FIFO);
    low_priority = sched_get_priority_max(SCHED_FIFO);
    mid_priority = (high_priority - low_priority)/2;

    //child 1, low priority
    switch(fork()){

    case -1:
        printf("failed to fork");
        break;
    case 0:
        printf("L\n");
        param.sched_priority = low_priority;
        sched_setscheduler(getpid(),SCHED_FIFO,&param);
        hlfunc();

            //child 2, high priority
            switch(fork()){

            case -1:
            printf("failed to fork");
                break;
            case 0:
                printf("H\n");
                param.sched_priority = high_priority;
                sched_setscheduler(getpid(),SCHED_FIFO,&param);
                hlfunc();


                        //child 3, medium priority
                switch(fork()){

                case -1:
                printf("failed to fork");
                    break;
                case 0:
                    param.sched_priority = mid_priority;
                    sched_setscheduler(getpid(),SCHED_FIFO,&param);
                    mfunc();
                    break;
                    //child three ends here
                default:
                    break;
                }
                //child 2 ends here
                break;
            default:
                break;
        }
        //child one ends here       
        break;
    default:
        break;

    }
    munmap(data, sizeof(data));
}

0 ответов

Другие вопросы по тегам