Я пытался написать программу, которая включает в себя отправку сигнала процессу для уведомления его о приостановке на некоторое время и возобновлении работы после получения другого сигнала. Я написал обработчик сигнала так:
void sig_handler(int alrm)
{
if(sig_rcv==0)
{
printf("Signal received..sig_rcv value: %d\n",sig_rcv);
sig_rcv = (sig_rcv+1)%2;
printf("After increment sig_rcv value: %d\n",sig_rcv);
signal(SIGUSR1,sig_handler);
if(pause()<0)
{
printf("Signal received again..\n");
}
}
else
{
sig_rcv = (sig_rcv+1)%2;
printf("Signal received..sig_rcv value: %d\n",sig_rcv);
signal(SIGUSR1,sig_handler);
}
printf("Exiting..\n");
}
Здесь я поддерживаю глобальную переменную sig_rcv, которая изначально равна 0, и если сигнал получен, когда он равен нулю, он переходит в условие if и делает паузу для другого сигнала. С другой стороны, если он получает сигнал во время sig_rcv равен 1, он просто изменит значение этой переменной.
Моя цель написать обработчик сигнала таким образом - использовать один и тот же сигнал для двух разных целей. Я использовал этот системный вызов:
signal(SIGUSR1,sig_handler);
Теперь, когда я отправлял SIGUSR1 процессу, он выполняется до оператора pause()
. Но после отправки SIGUSR1 во второй раз, он не показывает никакого эффекта. Он просто останавливается в операторе pause. Эта проблема была решена после того, как я использовал другой сигнал для удаления состояния паузы, например:
void sig_handler2(int a)
{
sig_rcv = (sig_rcv+1)%2;
printf("Restarting reading...\n");
}
и
signal(SIGUSR2,sig_handler2);
В этом случае все работало идеально.
Итак, мой вопрос: Почему происходит это явление? Разве мы не можем ждать сигнала при выполнении обработчика сигнала, записанного для того же сигнала? Если это так, то в чем причина? И есть ли способ достичь того же результата без использования SIGUSR2?