/minitalk

Сервер - клиентский мини-чат, использующий только 2 сигнала (SIGUSR1 и SIGUSR2) для отправки сообщения.

Primary LanguageC

Screen


"Это реально ненормальное программирование! :)"


Цель проекта:

Реализовать связь между двумя процессами Client и Server посредством сигналов в С, по стандарту 98 года.

В виде связи выступает передача строки от одного процесса к другому.

Реализация:

Текущий процесс приостанавливается (pause) и в нем работает обработчик сигнала, который срабатывает при получении сигнала (func my_handler).

Будем отправлять строку посредством сигналов sigusr1 и sigusr2. Один символ - отправка 8 сигналов.

Каждый сигнал будет отправлен в виде 0 или 1, символ будет переведен в ASCII код и далее в двоичную систему счисления.

Использовать будем сигналы sigusr1, означающий 1, и sigusr2, означающий 0.

Двоичная система счисления имеет 8 байт, следовательно server будет знать, что каждые 8 сигналов - это один символ. В таком случае нужно обратить внимание, что некоторые алгоритмы конвертации dec2bin отсеивают ведущие нули. Если запрос придет меньше 8 сигналов - сервер не обработает его.

Как только сервер принимает запрос (т.е один символ), он его переводит bin2dec и выводит на экран. Таким образом отсылается и выводится вся строка.

Стек технологий:

  • С
  • Signals

Screenshots

Ссылка

Ссылка

Ссылка

________________________________________________________________
Полезная информация и ссылки

Обработка сигналов занимает некоторое время, и если вы посылаете слишком много за один раз, некоторые из них могут быть проигнорированы. Именно поэтому я использую usleep.

Printf нельзя вызывать внутри сигнала. Именно из-за printf не мог понять почему server не принимал сигнал. Советую не использовать его в момент написания проекта или его тестирования.

Подробнее о SIGUSR1 и SIGUSR2

Передача файлов сигналами

Как узнать завершился ли процесс-потомок?

Список разрешенных функций внутри обработчика сигнала

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;
}

Если я помог как-то вам, то буду благодарен за звездочку :)