Два приложения на C++ для Linux: CLI-клиент и многопоточный сервер, обмен строками по IPC.
- Клиент (
app1_cli) — перед циклом ввода проверяет, что по пути сокета на диске есть узел (access); если файла нет — в stderr сообщение и выход с ненулевым кодом (промптEnter string:не показывается). Дальше читает строку до перевода строки, передаёт её серверу по IPC, печатает ответ. Если узел сокета есть, но сервер не слушает (например, после аварийного завершения), интерактивный режим может начаться — тогда ошибка подключения будет уже на первой отправке (connect). - Сервер (
app2_server) — принимает строку, переворачивает её, возвращает клиенту; в лог пишет локальное время, исходный текст и длительность обработки. 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 cmakeUnix 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 в текущем каталоге.