Являются ли сигналы в Linux формой IPC (Inter-Process Communication)?

«Являются ли сигналы в Linux формой IPC (Inter-Process Communication)?» — вопрос из категории Linux и ОС, который задают на 25% собеседований C/C++ Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, сигналы (signals) в Linux и других Unix-подобных системах являются примитивной и асинхронной формой межпроцессного взаимодействия (IPC). Один процесс (или ядро) может отправить сигнал другому процессу, уведомляя его о наступлении определенного события.

Характеристики сигналов как IPC:

  • Асинхронность: Сигнал может быть доставлен процессу в любой момент.
  • Минимализм: Передается только номер сигнала (например, SIGINT, SIGUSR1). Передача произвольных данных невозможна.
  • Предопределенный набор: Сигналы стандартизированы (около 30+ стандартных).

Пример отправки и обработки сигнала между процессами:

// Процесс-получатель (receiver.cpp)
#include <iostream>
#include <csignal>
#include <unistd.h>

void signal_handler(int sig) {
    std::cout << "Process " << getpid() << " received signal: " << sig << std::endl;
}

int main() {
    signal(SIGUSR1, signal_handler); // Установка обработчика для SIGUSR1
    std::cout << "My PID is: " << getpid() << std::endl;
    while(true) pause(); // Ожидание сигналов
    return 0;
}
# Процесс-отправитель (в командной строке)
# Узнаем PID процесса-получателя и отправляем сигнал
$ kill -SIGUSR1 <PID_receiver>

Ограничения и альтернативы: Из-за ограниченной пропускной способности и сложности надежной обработки, сигналы редко используются для прямого обмена данными. Для сложного IPC в C++ проектах чаще применяются:

  • Каналы (pipes) / FIFO: Для потокового обмена.
  • *Очереди сообщений POSIX (`mq_`):** Структурированные сообщения.
  • *Разделяемая память (`shm_`):** Для максимальной скорости.
  • Сокеты (Unix-domain или сетевые): Наиболее универсальный и надежный способ.