Как процессы в системе взаимодействуют между собой?devops-61

В Linux процессы могут взаимодействовать через несколько механизмов, каждый из которых имеет свои особенности и сценарии применения. Вот основные способы межпроцессного взаимодействия (IPC - Inter-Process Communication):

1. Сигналы

Простейший способ асинхронного уведомления процессов.

$ kill -SIGTERM 1234  # Отправка сигнала процессу

Основные сигналы:

  • SIGINT (2) - прерывание (Ctrl+C)
  • SIGTERM (15) - корректное завершение
  • SIGKILL (9) - принудительное завершение
  • SIGUSR1/SIGUSR2 - пользовательские сигналы

2. Каналы

Анонимные однонаправленные каналы для последовательной передачи данных.

Пример:

$ ls -l | grep .txt | wc -l

Особенности:

  • Однонаправленные
  • Работают только между родственными процессами
  • Ограниченный буфер (обычно 64KB)

3. Именованные каналы

Постоянные каналы в файловой системе.

$ mkfifo /tmp/my_pipe
$ echo "data" > /tmp/my_pipe &
$ cat /tmp/my_pipe

4. Разделяемая память

Самый быстрый способ обмена большими объемами данных.

Системные вызовы:

  • shmget() - создание/доступ
  • shmat() - подключение
  • shmdt() - отключение

Пример использования:

# В одном процессе:
shm_id = shmget(IPC_PRIVATE, size, IPC_CREAT | 0666)
ptr = shmat(shm_id, NULL, 0)

# В другом процессе:
ptr = shmat(shm_id, NULL, 0)

5. Очереди сообщений

Структурированный асинхронный обмен сообщениями.

Системные вызовы:

  • msgget()
  • msgsnd()
  • msgrcv()

6. Сокеты

Универсальный механизм, работающий даже между разными хостами.

Типы:

  • UNIX domain sockets (для локального взаимодействия)
  • Network sockets (TCP/UDP)

Пример UNIX socket:

sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
strcpy(sun_path, "/tmp/mysocket");
bind(sockfd, (struct sockaddr*)&addr, sizeof(addr));

7. Файлы

Простейший способ обмена данными через файловую систему.

Методы синхронизации:

  • Блокировки файлов (flock)
  • Семафоры
  • Inotify для отслеживания изменений

8. Семафоры

Механизм синхронизации доступа к ресурсам.

Системные вызовы:

  • semget()
  • semop()
  • semctl()

9. D-Bus

Современный высокоуровневый механизм для десктоп-приложений.

Пример:

dbus-send --session --dest=org.freedesktop.DBus \
          --type=method_call --print-reply \
          /org/freedesktop/DBus \
          org.freedesktop.DBus.ListNames

Сравнение методов IPC

МетодСкоростьСложностьНадежностьСценарии использования
СигналыВысокаяНизкаяНизкаяУведомления, управление
КаналыСредняяНизкаяСредняяКонвейеры командной строки
Разделяемая памятьОчень высокаяВысокаяВысокаяВысокопроизводительные приложения
СокетыСредняяСредняяВысокаяСетевое взаимодействие
Очереди сообщенийСредняяСредняяВысокаяСтруктурированный обмен данными

Пример взаимодействия веб-сервера и БД:

  1. Веб-сервер получает запрос через сетевой сокет
  2. Отправляет запрос в БД через UNIX socket
  3. БД использует разделяемую память для кэша
  4. Веб-сервер получает ответ и отправляет его клиенту
  5. При аварийной ситуации менеджер процессов посылает SIGTERM

Резюмируем: Linux предоставляет богатый набор механизмов IPC - от простых сигналов до сложных систем разделяемой памяти. Выбор конкретного метода зависит от требований к производительности, надежности и сложности реализации. Для современных приложений часто комбинируют несколько подходов для достижения оптимального результата.