Сигналы
Асинхронное уведомление, доставляемое процессу или потоку ядром. См. 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)).
| Номер | Имя | Действие | Описание |
|---|---|---|---|
| 1 | SIGHUP | Term | Hangup управляющего терминала |
| 2 | SIGINT | Term | Ctrl+C |
| 3 | SIGQUIT | Core | Ctrl+\ |
| 6 | SIGABRT | Core | abort(3) |
| 8 | SIGFPE | Core | Арифметическая ошибка |
| 9 | SIGKILL | Term | Безусловное завершение, не перехватывается, не блокируется |
| 11 | SIGSEGV | Core | Недопустимое обращение к памяти |
| 13 | SIGPIPE | Term | Запись в pipe без читателей |
| 14 | SIGALRM | Term | alarm(2) |
| 15 | SIGTERM | Term | Запрос завершения (по умолчанию для kill) |
| 17 | SIGCHLD | Ign | Изменение состояния потомка |
| 19 | SIGSTOP | Stop | Не перехватывается, не блокируется |
| 20 | SIGTSTP | Stop | Ctrl+Z |
| 18 | SIGCONT | Cont | Возобновить остановленный процесс |
| SIGRTMIN..SIGRTMAX | RT | Term | Real-time, очередуются |
SIGKILL (9) и SIGSTOP (19) нельзя ни перехватить, ни проигнорировать, ни заблокировать.
kill(1234, SIGTERM);
raise(SIGUSR1);
struct sigaction sa = { .sa_handler = handler };
sigaction(SIGINT, &sa, NULL);
Системные вызовы
| Категория | Вызовы | Назначение |
|---|---|---|
| Файлы | open, read, write, close, lseek | I/O |
| Процессы | fork, clone, execve, wait4, exit_group | Управление процессами |
| Память | mmap, munmap, brk, mprotect | Виртуальная память |
| Время | clock_gettime, nanosleep, timer_create | Время и таймеры |
| IPC | pipe2, 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, SIGRTMIN | read, fork, execve |