Сигналы
Асинхронное уведомление, доставляемое процессу или потоку ядром. См. signal(7).
Классы
- Стандартные (1–31 на большинстве архитектур) — не очередуются: повторный одинаковый сигнал во время ожидания обычно не накапливается.
- Реального времени (
SIGRTMIN–SIGRTMAX, обычно 34–64) — очередуются с сохранением порядка и payload (sigqueue(3)).
Обработка
Каждый поток имеет signal mask (sigprocmask(2)/pthread_sigmask(3)) и pending-набор; диспозиции сигналов общие на процесс (sigaction(2)).
Этапы:
- Генерация —
kill(2),tkill(2),tgkill(2),raise(3),sigqueue(3), аппаратный fault, событие ядра (alarm(2), таймеры). - Pending — сигнал ставится в pending-набор потока/процесса.
- Доставка — при выходе из ядра в 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);
}