Обработчик сигнала, изменяющий глобальную переменную в c - PullRequest
0 голосов
/ 10 мая 2018

Такая структура создается в каждом из моих дочерних процессов.

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, пытаясь выяснить, как это сделать. Действительно нужна помощь.

...