Other Alias
rt_sigreturn
ОБЗОР
int sigreturn(...);
ОПИСАНИЕ
Если ядро Linux обнаруживает, что неблокированный сигнал ожидает обработки
процессом, то при следующем переключении в пользовательский режим в этом
процессе (например, при возврате из системного вызова или когда процесс
перепланируется на ЦП), оно сохраняет различные части контекста процесса
(состояние слова процессора, регистры, маску сигналов и настройки стека
сигналов) в стек пространства пользователя.
Также ядро делает так, что при переходе в пользовательский режим вызывается обработчик сигналов и при возврате из обработчика управление передаётся части кода пользовательского пространства, называемого «сигнальным батутом»(signal trampoline). Код сигнального батута, в свою очередь, вызывает sigreturn().
Вызов sigreturn() очищает всё что накопилось — изменяет маску сигнала процесса, переключает стеки сигналов (см. sigaltstack(2)) — чтобы вызвать обработчик сигнала. Он восстанавливает маску сигналов процесса, переключает стеки и восстанавливает контекст процесса (регистры и флаги процессора, включая указатель стека и инструкций), так что процесс непосредственно возобновляет исполнение с точки где был прерван сигналом.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Вызов sigreturn() не возвращает значений.
СООТВЕТСТВИЕ СТАНДАРТАМ
Во многих системах UNIX есть системный вызов sigreturn() или его
эквивалент. Однако этот вызов отсутствует в POSIX, и в разных системах он
работает по-разному.
ЗАМЕЧАНИЯ
Существующий вызов sigreturn() служит только для реализации обработчиков
сигналов. Никогда не вызывайте его напрямую. Содержимое аргументов (если
есть), передаваемые sigreturn(), для каждой архитектуры свои.
Когда-то системы UNIX помещали код сигнального батута в пользовательский стек. В настоящее время страницы пользовательского стека защищены и в них невозможно выполнить код. Поэтому в современных системах Linux, в зависимости от архитектуры, код сигнального батута хранится или в vdso(7) или в библиотеке C. В последнем случае библиотека C предоставляет расположение код батута в поле sa_restorer структуры sigaction, которая передаётся sigaction(2), и устанавливает флаг SA_RESTORER в поле sa_flags.
Сохранённая информация контекста процесса помещается в структуру ucontext_t (смотрите <sys/ucontext.h>). Эта структура видима внутри обработчика сигнала как третий аргумент обработчика, установившего флаг SA_SIGINFO.
В некоторых других системах UNIX работа сигнального батута несколько отличается. В частности, в некоторых системах при переходе в пользовательский режим ядро передаёт управление батуту (а не обработчику сигнала) и код батута вызывает обработчик сигнала (и затем вызывает sigreturn() после завершения работы обработчика).