← 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)).

НомерИмяДействиеОписание
1SIGHUPTermHangup управляющего терминала
2SIGINTTermCtrl+C
3SIGQUITCoreCtrl+\
6SIGABRTCoreabort(3)
8SIGFPECoreАрифметическая ошибка
9SIGKILLTermБезусловное завершение, не перехватывается, не блокируется
11SIGSEGVCoreНедопустимое обращение к памяти
13SIGPIPETermЗапись в pipe без читателей
14SIGALRMTermalarm(2)
15SIGTERMTermЗапрос завершения (по умолчанию для kill)
17SIGCHLDIgnИзменение состояния потомка
19SIGSTOPStopНе перехватывается, не блокируется
20SIGTSTPStopCtrl+Z
18SIGCONTContВозобновить остановленный процесс
SIGRTMIN..SIGRTMAXRTTermReal-time, очередуются

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

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

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

КатегорияВызовыНазначение
Файлыopen, read, write, close, lseekI/O
Процессыfork, clone, execve, wait4, exit_groupУправление процессами
Памятьmmap, munmap, brk, mprotectВиртуальная память
Времяclock_gettime, nanosleep, timer_createВремя и таймеры
IPCpipe2, mq_send, semop, shmgetМежпроцессное взаимодействие
Сетьsocket, bind, connect, sendmsg, recvmsgСокеты
Сигналыkill, sigaction, sigprocmask, signalfd4Управление сигналами
pid_t pid = fork();
if (pid == 0) {
    execl("/bin/ls", "ls", "-l", (char *)NULL);
} else {
    waitpid(pid, NULL, 0);
}

Сигнал vs syscall

КритерийСигналSyscall
ПриродаАсинхронное уведомлениеСинхронный вход в ядро
ИнициаторЯдро или другой процессСам процесс
Направлениев процесспроцесс → ядро
Передача управленияв произвольной точке (user-space → handler)по инструкции syscall/svc
ПримерыSIGSEGV, SIGTERM, SIGRTMINread, fork, execve

Ссылки

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