Почему не вызывается мой обработчик сигнала?

Я работаю над назначением, которое использует сигналы для передачи двоичного сообщения между двумя процессами с целью изучения сигналов (это действительно странное использование).

В программе два процесса передают код, а затем один передает сообщение другому. SIGUSR1 представляет 0, SIGUSR2 представляет 1. Идея состоит в том, что процесс, отправляющий сообщение, будет использовать функцию kill с любым SIGUSR, чтобы передать сообщение, У меня запускается отправитель. он спит, пока ожидает отправки кода. Получатель отправляет два SIGINT для обозначения «пароля», используя pidof (8) , чтобы найти pid отправителя.

После того, как обработчик сигналов отправителя прочитал эти сигналы, определил, что это правильный пароль, он затем переходит к отправке сообщения.

Получатель теперь выполнил несколько функций и каждую секунду спит, ожидая каждого бита передаваться через прерывание. Проблема в том, что этого никогда не происходит.

Я настроил его таким образом, чтобы отправитель отправлял бит (в данном случае 0) следующим образом:

kill(washingtonPID,SIGUSR1);

где WashintonPID - это PID получателя, и я проверил, что это правильный PID.

обработчик получателя подключается следующим образом:

//IN MAIN
    signal(SIGINT,bitReceiver);
    signal(SIGUSR1,bitReceiver);
    signal(SIGUSR2,bitReceiver);
//OUTSIDE MAIN

    void bitReceiver(int signum)
{
    if(signum == SIGUSR1)
    {
        fprintf(stderr,"SIGUSR1 - 0");
        bit = 0;
    }
    else if (signum == SIGUSR2)
    {
        fprintf(stderr,"SIGUSR2 - 1");
        bit = 1;
    }
    else //sigint
    raise(SIGINT);

    return;
}

где бит - глобальная переменная. изначально он установлен на -1.

Вот функция, которая считывает биты:

 int receiveBit()
{
    while(bit == -1)
    {
        sleep(1);
    }
    fprintf(stderr,"%d",bit);
    int bit2 = bit;
    bit = -1;
    return bit2;
}

Итак, основное выполнение таково: После того, как код был отправлен от получателя к отправителю, отправитель начинает отправлять сигналы уничтожения USR1 и USR2 получателю, которые в конечном итоге должны сформировать двоичное сообщение.

Получатель просто ждет в этот момент, спит каждый второй. Когда он прерывается, обработчик устанавливает бит в 0 или 1, выводит его из спящего режима, печатает бит и возвращает его.

Если я позволю двум программам работать нормально, приемник просто останется в спящем режиме, а обработчик никогда не будет вызван (даже если я могу видеть вызовы, сделанные другим процессом.

Если я остановлю отправителя, и вручную отправить сигналы Kill, я могу отправить один, может быть, два сигнала, оба обработанные должным образом. в любом случае после этого я получаю сообщение, напечатанное на терминале, например, «сигнал пользователя 2». Этого нет в моей программе, и программа немедленно останавливается.

Мы будем очень признательны за любые идеи относительно того, почему мой обработчик не вызывается и почему я не могу вручную отправить более одного или двух сигналов.

Спасибо за ваше время.

РЕДАКТИРОВАТЬ: Похоже, что люди озадачены этим. Могу ли я попробовать какие-нибудь советы по отладке?

6
задан ionnm 3 April 2019 в 21:18
поделиться