← Назад к вопросам

Какие особенности разработки под Linux и какие инструменты используешь?

1.0 Junior🔥 151 комментариев
#Linux и операционные системы

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Разработка C/C++ Backend под Linux

Linux — это золотой стандарт для backend разработки. Требует понимания системных уровней, сетевого программирования и правильного выбора инструментов для production-ready приложений.

Особенности Linux разработки

Различия от Windows:

  • Путі: forward slash /, переменные окружения через bash
  • Разрешения: chmod, владельцы файлов, sudo для привилегий
  • Сигналы: SIGTERM, SIGKILL, SIGSEGV — нужно обрабатывать graceful shutdown
  • Многопроцессность: fork/exec вместо CreateProcess
  • Сокеты: Unix domain sockets для IPC быстрее чем TCP
  • Системные вызовы: epoll/kqueue для асинхронного I/O
#include <signal.h>
#include <unistd.h>

void signal_handler(int sig) {
    if (sig == SIGTERM) {
        // Graceful shutdown
        cleanup();
        exit(0);
    }
}

int main() {
    signal(SIGTERM, signal_handler);
    signal(SIGINT, signal_handler);
    // ...
}

Инструменты разработки

Компиляторы и сборка:

  • gcc/g++ — стандартный компилятор Linux
  • clang — лучше диагностика ошибок, совместимость с gcc
  • cmake — кроссплатформенная система сборки (современный стандарт)
cmake -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build -j$(nproc)
  • make — классический инструмент (Makefile)
  • ninja — быстрая альтернатива make

Отладка:

  • gdb — GNU debugger, standard

    gdb ./program
    (gdb) break main
    (gdb) run
    (gdb) print variable
    (gdb) backtrace
    
  • valgrind — детектор утечек памяти и ошибок

    valgrind --leak-check=full --show-leak-kinds=all ./program
    
  • AddressSanitizer — встроенный в компилятор

    gcc -fsanitize=address -g program.cpp
    ./a.out  # Сразу видны memory violations
    

Профилирование:

  • perf — Linux profiler

    perf record ./program
    perf report  # Где тратится время
    
  • gprof — GNU profiler

    gcc -pg program.cpp
    ./a.out
    gprof a.out gmon.out
    

Статический анализ:

  • cppcheck — проверка на типичные ошибки
  • clang-analyzer — интегрирован в clang
  • SonarQube — enterprise solution

Системное программирование

Работа с процессами:

#include <unistd.h>
#include <sys/wait.h>

pid_t pid = fork();
if (pid == 0) {
    // Дочерний процесс
    execve("/bin/ls", args, env);
} else {
    // Родительский процесс
    int status;
    waitpid(pid, &status, 0);
}

Асинхронный I/O с epoll:

#include <sys/epoll.h>

int epoll_fd = epoll_create1(0);
epoll_event events[10];
while (true) {
    int n = epoll_wait(epoll_fd, events, 10, -1);
    for (int i = 0; i < n; ++i) {
        if (events[i].events & EPOLLIN) {
            // Данные готовы к чтению
            handle_read(events[i].data.fd);
        }
    }
}

Unix domain sockets (IPC):

int sock = socket(AF_UNIX, SOCK_STREAM, 0);
sockaddr_un addr = {};
strcpy(addr.sun_path, "/tmp/socket.sock");
addr.sun_family = AF_UNIX;
bind(sock, (sockaddr*)&addr, sizeof(addr));
listen(sock, 5);
// Намного быстрее TCP localhost

Инструменты мониторинга

  • htop — process monitor с красивым UI
  • iotop — мониторинг дисковых операций
  • nethogs — сетевой трафик по процессам
  • systemd-analyze — профилирование старта системы

Версионирование и CI/CD

# GCC версия
g++ --version

# Компиляция с флагами
g++ -Wall -Wextra -O2 -std=c++17 program.cpp

# Static linking
g++ -static program.cpp -o binary

# Dynamic linking с RPATH
g++ -Wl,-rpath,/path/to/lib program.cpp

Production практики

Логирование:

  • Используй syslog для системных приложений
  • Структурируй логи (JSON format для парсинга)
  • Разделяй уровни: DEBUG, INFO, WARNING, ERROR, CRITICAL

Graceful shutdown:

std::atomic<bool> running = true;

void signal_handler(int sig) {
    running = false;
}

int main() {
    signal(SIGTERM, signal_handler);
    while (running) {
        process_task();
    }
    cleanup_connections();
    flush_buffers();
}

Resource limits:

ulimit -n 65536  # File descriptors
ulimit -s unlimited  # Stack size

Контейнеризация:

  • Docker часто используется для development
  • Linux namespaces и cgroups для изоляции ресурсов

Линукс разработка требует глубокого понимания ОС, но даёт максимальный контроль и производительность для backend систем.

Какие особенности разработки под Linux и какие инструменты используешь? | PrepBro