← Back to notes

Сигналы и системные
вызовы в Linux


Сигналы

Асинхронное уведомление, доставляемое процессу или потоку ядром. См. signal(7).


Классы

  • Стандартные (1–31 на большинстве архитектур) — не очередуются: повторный одинаковый сигнал во время ожидания обычно не накапливается.
  • Реального времени (SIGRTMINSIGRTMAX, обычно 34–64) — очередуются с сохранением порядка и payload (sigqueue(3)).

Обработка

Каждый поток имеет signal mask (sigprocmask(2)/pthread_sigmask(3)) и pending-набор; диспозиции сигналов общие на процесс (sigaction(2)).

Этапы:

  1. Генерацияkill(2), tkill(2), tgkill(2), raise(3), sigqueue(3), аппаратный fault, событие ядра (alarm(2), таймеры).
  2. Pending — сигнал ставится в pending-набор потока/процесса.
  3. Доставка — при выходе из ядра в user space, если сигнал не заблокирован: выполняется диспозиция (default, ignore, handler).

Действия по умолчанию: term, core, ign, stop, cont (см. signal(7)).


Стандартные сигналы

Номера приведены для x86/ARM/RISC-V (на Alpha/MIPS/SPARC отличаются — ориентируйтесь на имена; см. signal(7)).

SIGKILL (9) и SIGSTOP (19) нельзя ни перехватить, ни проигнорировать, ни заблокировать.

kill(1234, SIGTERM);
raise(SIGUSR1);
struct sigaction sa = { .sa_handler = handler };
sigaction(SIGINT, &sa, NULL);

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

pid_t pid = fork();
if (pid == 0) {
    execl("/bin/ls", "ls", "-l", (char *)NULL);
} else {
    waitpid(pid, NULL, 0);
}

Сигнал vs syscall


Ссылки

Сигналы и системные вызовы в Linux | Aleksandr Suprun