Такая структура создается в каждом из моих дочерних процессов.
struct locker_t {
uint16_t id;
uint16_t user_id;
uint8_t locked;
uint8_t owned;
int write_fd;
int read_fd;
int owner;
};
и я хочу, чтобы мой дочерний процесс мог обрабатывать сигналы SIGUSR1 и SIGUSR2.
Если дочерний элемент получает SIGUSR1, тогда измените locker_t.locked на 1. Дочерний объект также изменяет locker_t.locked на 0, если он получает SIGUSR2.
Поэтому я создал глобальную переменную с именем int lockSig, для начала она равна -1. Также я создал два обработчика сигнала:
void lockHandler(int sig){
lockSig=1;
}
void unlockHandler(int sig){
lockSig=0;
}
У меня также есть эти 2 для получения сигналов и изменения блокировки:
signal(SIGUSR1,lockHandler);
signal(SIGUSR2,unlockHandler);
if(strcmp(buffer,"LOCK")==0||lockSig==1)//if lockSig is 1 then enter the if{
lock.locked=1;
fscanf(kid,"%d",&temp);//wait parent to run until gets an input
lockSig=-1;//change back to -1, wait for next signal
}
if(strcmp(buffer,"UNLOCK")==0||lockSig==0)//if lockSig is 0 then enter the if{
lock.locked=0;
fscanf(kid,"%d",&temp);//wait parent to run until gets an input
lockSig=-1;//change back to -1, wait for next signal
}
Но моя программа не меняет lock.locked. I'm pretty sure the child gets the signal since I used printf to test it. I'm also using a infinite loop to read pipe inputs from parent and everything else works perfectly.
Впервые я использую обработчики сигналов. Я потратил навсегда на Google, пытаясь выяснить, как это сделать. Действительно нужна помощь.