forked from mizabrik/acos-notes
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsignals.tex
More file actions
108 lines (95 loc) · 8.43 KB
/
signals.tex
File metadata and controls
108 lines (95 loc) · 8.43 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
\documentclass[main]{subfiles}
\begin{document}
\chapter{Сигналы}
Сигнал --- это аналог прерываний на уровне ОС. Для большей части
сигналов программа может установить свой обработчик на сигнал.
Обычно, используется для уведомлении программы о событиях или управления
её поведением. Подробнее можно читать в signal(7).
Особыми являются SIGKILL (обычно --- номер 9) и SIGSTOP: программа не может
установить на них своё действие, не может проигорировать и замаскировать их.
Следовательно, SIGKILL всегда завершает процесс, а SIGSTOP всегда будет
приостанавливать его до получения SIGCONT (его уже можно обработать).
В ядре для каждого процесса выделяется как минимум три очереди сигналов:
\begin{enumerate}
\item Очередь обычных сигналов --- "целиком"
\item Очередь сигналов потоку
\item Сигналы реального времени
\end{enumerate}
Очередь дополнительно содержит маску уже полученных (и необработанных) сигналов.
Кроме того, хранится список информации о полученных сигналах.
Если приходит новый сигнал, но он
уже отмечен, то новая запись не будет добавлена в список, если размер
Тут было сказано, что на самом деле всё не так.
Очередь дополнительно содержит маску уже полученных (и необработанных) сигналов.
Для каждого сигнала хранится своя очередь; она ограничена
в размере, но первый сигнал данного вида будет сохранён всегда.
Если же сигнал такого вида уже был получен, а размер очереди исчерпан, то
он сохранён не будет.
Очерёдность обработки сигналов гарантированно сохраняется, но не для SIGKILL
(он будет обработан немедленно после завершения системного вызова ввода-вывода,
если он запущен) и SIGSTOP/SIGCONT.
Обработчики сигналов могут быть следующими:
\begin{itemize}
\item IGN --- полное игнорирование сигнала, он даже не будет внесён в
очередь (не путать с маскированием сигналов, которое позволяет обработать
их позже). Однако, не все сигналы могут быть проигнорированы.
\item DFL --- стандартный обработчик для сигнала, выполняется в контексте ОС.
В зависимости от сигнала, ОС может убить процесс, убить процесс и сделать dump
памяти, остановка и возобновление выполнения процесса, игнорирование сигнала.
\item Пользовательский обработчик сигнала --- самый ресурсоёмкий вид обработчиков.
В таком случае, когда процесс получит новый квант времени, вместо нормального
продолжения работы происходит замена стека, маскирование этого вида сигналов
и вызов функции обработчика (в контексте самого процесса, а не ядра).
Кроме того, конечно, запоминается состояние: регистры, положение в коде,
которое будет восстановлено со стеком после завершения обработчика.
\end{itemize}
В зависимости от реализации ОС, сигнал посланный процессу будет
Если сигнал отослан процессу, то он либо будет отправлен какому-то главному
потоку, либо произвольному, у которого он не маскирован.
Кроме того, сигнал можно отправить конкретному потоку.
Отдельно стоит отметить сигналы SIGUSR1 и SIGUSR2, которые предназначены
для целей пользователя. Например, dd выведет прогресс копирования
при получении SIGUSR1. Стандартное действие, впрочем --- это убийство
процесса.
\section{Сигналы реального времени}
Это сигналы с номерами от RTMIN до RTMAX и полностью предназначены для
пользовательских целей. Кроме того, они сохраняются в отдельную очередь.
\section{Работа с сигналами}
В Си для работы с сигналами доступны следующие функции:
\begin{description}
\item[signal(sig, handler)] Устанавливает обарботчик сигнала.
Принимает номер сигнала, новый обработчик
и возвращает старый обработчик при успехе либо SIGERR при неудаче.
В некоторых реализациях обработчик может сбрасываться после получения сигнала.
Считается устаревшим.
\item[sigaction(sig, sact, oact)] Замена signal, позволяет более тонкую
настройку с помощью структуры sigaction. sact --- указатель на новый sigaction,
oact --- куда записать старый. Возвращает 0 при успехе и -1 при ошибке.
\item[raise(sig)] Отправить сигнал своему процессу.
\item[kill(pid, sig)] Отправить указанному процессу сигнал.
\item[sigprocmask(mask)] Установить новую маску сигнала для процесса.
\item[sчтототам]
\item[sigwaitinfo]
\item[sigsuspend]
\item[pthread\_sigprocinsert)]
\end{description}
\section{Некоторые сигналы}
\begin{description}
\item[SIGILL] процессор встретил некорректную инструкцию.
Стандартный обработчик --- завершение процесса с сохранением дампа памяти.
\item[SIGBUS] некорректное обращение к памяти, проблемы с выравниванием, например.
Также может быть связано с разделяемой памятью.
\item[SIGSEGV] Работа с памятью вопреки правам на сегмент или страницу, работа
с несуществующими страницами памяти.
\item[SIGINT] Прерывание с помощью клавиатуры, именно его посылает терминал
при нажатии Ctrl-C.
\item[SIGTSTP] "Мягкая" остановка процесса, посылается терминалом при нажатии Ctrl-Z.
\item[SIGHUP]
\item[SIGALR] Некоторый таймер завершился. Может быть использован в реализации sleep.
\item[SIGTERM] Процесс должен быть завершён. Обычно отправляется перед SIGKILL
ядром и некоторыми другими программами для мягкого завершения процесса.
\item[SiGTTOUT]
\end{description}
Системные вызвы: signal, sigaction, kill, sigqueue, sigprocmask, pause,
sigwaitinfo.
\end{document}