Я работаю над назначением, которое использует сигналы для передачи двоичного сообщения между двумя процессами с целью изучения сигналов (это действительно странное использование).
В программе два процесса передают код, а затем один передает сообщение другому. 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». Этого нет в моей программе, и программа немедленно останавливается.
Мы будем очень признательны за любые идеи относительно того, почему мой обработчик не вызывается и почему я не могу вручную отправить более одного или двух сигналов.
Спасибо за ваше время.
РЕДАКТИРОВАТЬ: Похоже, что люди озадачены этим. Могу ли я попробовать какие-нибудь советы по отладке?