Как посчитать, сколько раз процесс получил сигнал - PullRequest
1 голос
/ 11 мая 2019

Другой запущенный процесс (код которого я не могу получить) отправит моему процессу набор сигналов SIGUSR2 и два сигнала SIGUSR1 в случайном порядке.Цель моей программы - вычислить, сколько раз он принимал сигнал SIGUSR2 между приемом первого и второго сигналов SIGUSR1.

(другой процесс начнет отправку после получения сигнала SIGUSR1 от моего процесса).

Я новичок в обработке сигналов, поэтому, если это как-то связано с зацикливанием, мне становится труднее.Я видел, что работа с сигналами бесконечного цикла является довольно распространенным явлением, но он кусает меня, как правильно его реализовать.

int counter=0;

void count_up(){
    counter++; 
}

void signal_catcher(){
    signal(SIGUSR2,count_up); 
// I think here should go some sort of loop that makes it keep catching SIGUSR2
// There should be some flag or somtehing too, so that it stops after receiving 
// the second SIGUSR1
}

int main(int argc, char *argv[]){
    int pid_sender = atoi(argv[1]);
    kill(pid_sender,SIGUSR1); //The other process is notified to start
    signal(SIGUSR1,signal_catcher); //The first SIGUSR1 is catched 
}

1 Ответ

0 голосов
/ 11 мая 2019

Так просто.Давайте сначала создадим обработчик SIGUSR2, основываясь на вашем:

int counter;

void catch_usr2(void) {
    counter++;
}

И обработчик SIGUSR1:

int sw;

void catch_usr1(void) {
    if(!sw) {
        signal(SIGUSR2, catch_usr2);
        sw = 1;
    } else {
        signal(SIGUSR2, SIG_DFL);
        /* Side note: If you want to count these only single time, remove line below. */
        sw = 0;
    }
}

Этот первый сигнал установит SIGUSR2 в процедуру противодействияи установите sw в 1. В следующий раз, когда SIGUSR1 перехватывается, обработчик удаляет себя.И давайте зарегистрируем его как обработчик SIGUSR1:

signal(SIGUSR1, catch_usr1);

Предполагая последовательность 2122212, этот код оставит counter равным 3.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...