Skip to content

Latest commit

 

History

21 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

cli-srv

Два приложения на C++ для Linux: CLI-клиент и многопоточный сервер, обмен строками по IPC.

Задача

  1. Клиент (app1_cli) — перед циклом ввода проверяет, что по пути сокета на диске есть узел (access); если файла нет — в stderr сообщение и выход с ненулевым кодом (промпт Enter string: не показывается). Дальше читает строку до перевода строки, передаёт её серверу по IPC, печатает ответ. Если узел сокета есть, но сервер не слушает (например, после аварийного завершения), интерактивный режим может начаться — тогда ошибка подключения будет уже на первой отправке (connect).
  2. Сервер (app2_server) — принимает строку, переворачивает её, возвращает клиенту; в лог пишет локальное время, исходный текст и длительность обработки.
  3. run.sh — собирает и запускает оба процесса; stop завершает сервер (PID в .runtime/app2_server.pid) и процессы, в командной строке которых есть подстрока build/app1_cli/app1_cli (pkill -f), затем удаляет файл сокета. Так покрываются и запуск ./build/app1_cli/app1_cli, и полный путь к тому же бинарнику. В режиме run после выхода из CLI или Ctrl+C снимается только сервер (клиент уже завершился сам или получил сигнал с терминала).

Общие требования: CMake 3.25+, компилятор C++17 (GCC или Clang). Сборка — из корня репозитория.

Зависимости

Ubuntu:

sudo apt update
sudo apt install -y git build-essential cmake

IPC

Unix domain socket (AF_UNIX, потоковый), путь по умолчанию /tmp/ipc.sock. Для пары процессов на одной машине это даёт запрос–ответ без сетевого стека и с тем же API, что у TCP-сокетов.

Переопределение: SOCKET_PATH для run.sh или build/app1_cli/app1_cli <путь> / build/app2_server/app2_server <путь_сокета> [путь_лог].

Сборка

cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build -j"$(nproc)"

либо ./run.sh build. Бинарники: build/app1_cli/app1_cli, build/app2_server/app2_server.

Запуск

  • Интерактивно: ./run.sh или ./run.sh run — сервер в фоне, CLI в переднем плане. После EOF (Ctrl+D) или выхода из клиента срабатывает trap в скрипте и процесс сервера завершается; клиент к этому моменту уже завершился сам. Ctrl+C тоже вешает тот же trap — сервер будет убран явно.
  • Только сервер: ./run.sh start, клиенты вручную (build/app1_cli/app1_cli и при необходимости тот же путь сокета, что у сервера). ./run.sh stop гасит сервер и зависшие экземпляры app1_cli по шаблону build/app1_cli/app1_cli (см. выше).

Несколько клиентов: после ./run.sh start можно параллельно запустить несколько build/app1_cli/app1_cli с тем же путём сокета. Главный поток только accept; очередь listen(..., 5); на каждое соединение — std::thread: чтение, переворот, запись в лог (std::mutex), ответ, close клиентского fd.

Через run.sh лог: <корень_репозитория>/server.log. При ручном запуске сервера без второго аргумента — server.log в текущем каталоге.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages