Создать приоритетную инверсию, разветвив три дочерних процесса?
Я пытаюсь создать инверсию приоритетов путем разветвления трех дочерних процессов. Однако я не могу достичь желаемого результата. Может кто-нибудь помочь мне, где я иду не так. Это код, который я написал до сих пор. Я хочу создать этот сценарий, а затем исправить его, используя приоритетное наследование с помощью 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,¶m);
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,¶m);
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,¶m);
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));
}