Реализовать связь между двумя процессами Client и Server посредством сигналов в С, по стандарту 98 года.
В виде связи выступает передача строки от одного процесса к другому.
Текущий процесс приостанавливается (pause) и в нем работает обработчик сигнала, который срабатывает при получении сигнала (func my_handler).
Будем отправлять строку посредством сигналов sigusr1 и sigusr2. Один символ - отправка 8 сигналов.
Каждый сигнал будет отправлен в виде 0 или 1, символ будет переведен в ASCII код и далее в двоичную систему счисления.
Использовать будем сигналы sigusr1, означающий 1, и sigusr2, означающий 0.
Двоичная система счисления имеет 8 байт, следовательно server будет знать, что каждые 8 сигналов - это один символ. В таком случае нужно обратить внимание, что некоторые алгоритмы конвертации dec2bin отсеивают ведущие нули. Если запрос придет меньше 8 сигналов - сервер не обработает его.
Как только сервер принимает запрос (т.е один символ), он его переводит bin2dec и выводит на экран. Таким образом отсылается и выводится вся строка.
- С
- Signals
Полезная информация и ссылки
Обработка сигналов занимает некоторое время, и если вы посылаете слишком много за один раз, некоторые из них могут быть проигнорированы. Именно поэтому я использую usleep.
Printf нельзя вызывать внутри сигнала. Именно из-за printf не мог понять почему server не принимал сигнал. Советую не использовать его в момент написания проекта или его тестирования.
bin2dec и dec2bin
int bin2dec(int n)
{
int num;
int dec_value;
int base;
int temp;
int last_digit;
num = n;
base = 1;
dec_value = 0;
temp = num;
while (temp)
{
last_digit = temp % 10;
temp = temp / 10;
dec_value += last_digit * base;
base = base * 2;
}
return dec_value;
}
int dec2bin(int server_pid, int num)
{
int bin = 0;
int k = 1;
int i = 0;
while (num)
{
bin += (num % 2) * k;
k *= 10;
num /= 2;
i++;
}
return bin;
}