Чтение онлайн

на главную - закладки

Жанры

Linux программирование в примерах
Шрифт:

В отличие от большинства глав в данной книге, наше представление здесь историческое, связанное с освещением развития API, включая API, которые никогда не следует использовать в новом коде. Мы делаем это, потому что это упрощает изложение, делая понятным, почему функция POSIX API

sigaction
поддерживает все те возможности, которые поддерживает.

10.2. Действия сигналов

Каждый сигнал (вскоре мы представим полный список) имеет связанное с ним действие по умолчанию. POSIX обозначает это как диспозицию (disposition) сигнала. Это то действие, которое ядро осуществляет для процесса, когда поступает определенный сигнал. Действие по умолчанию варьирует:

Завершение

Процесс завершается.

Игнорирование

Сигнал игнорируется. Программа никогда не узнает, что что-то случилось.

Снимок

образа процесса

Процесс завершается, и ядро создает файл core (в текущем каталоге процесса), содержащий образ работавшей на момент поступления сигнала программы. Снимок процесса может впоследствии использоваться с отладчиком для исследования состояния программы (см. главу 15 «Отладка»).

По умолчанию системы GNU/Linux создают файлы с именем

core.pid
, где
pid
является ID завершаемого процесса. (Это можно изменить; см. sysctl(8).) Такое именование позволяет хранить в одном и том же каталоге несколько файлов
core
, за счет использования большего дискового пространства. [105] Традиционные системы Unix называют файл
core
, и это ваше дело сохранить какие-нибудь файлы
core
для последующего изучения, если есть шанс создания других таких же файлов в том же каталоге.

105

По крайней мере один поставщик дистрибутивов GNU/Linux отменяет сознание файлов

core
«с иголочки». Для повторного подключения этой возможности поместите в свой файл
~/.profile
строку '
ulimit -S -с unlimited
' — Примеч. автора.

Остановка

Процесс останавливается. Впоследствии он может быть возобновлен. (Если вы использовали управление заданиями оболочки с помощью CTRL-Z,

fg
и
bg
, вы понимаете остановку процесса.)

10.3. Стандартные сигналы С:

signal
и
raise

Стандарт ISO С определяет первоначальный API управления сигналами V7 и новый API для посылки сигналов. Вы должны использовать их для программ, которым придется работать на не-POSIX системах, или в случаях, когда предоставляемые ISO С API возможности являются достаточными.

10.3.1. Функция

signal

Действие сигнала изменяется с помощью функции

signal
. Вы можете изменить действие на «игнорировать сигнал», «восстановить для сигнала действие системы по умолчанию» или «вызвать при появлении сигнала мою функцию с номером сигнала в качестве параметра».

Функция, которую вы предоставляете для распоряжения сигналом, называется обработчиком сигнала (или просто обработчиком), а установка ее в соответствующем месте осуществляет перехват (catch) сигнала.

Получив эти сведения, давайте перейдем к API. В заголовочном файле

<signal.h>
представлены определения макросов для поддерживаемых сигналов и объявления функций управления сигналами, предоставляемыми стандартом С:

#include <signal.h> /* ISO С */

void (*signal(int signum, void (*func)(int)))(int);

Это объявление для функции signal почти невозможно прочесть. Поэтому справочная страница GNU/Linux signal(2) определяет ее таким способом:

typedef void (*sighandler_t)(int);

sighandler_t signal(int signum, sighandler_t handler);

Теперь это более вразумительно. Тип

sighandler_t
является указателем на функцию с возвращаемым типом
void
, которая принимает один целый аргумент. Это целое является номером поступающего сигнала.

Функция

signal
принимает номер сигнала в качестве своего первого параметра, а указатель функции (новый обработчик) в качестве своего второго аргумента. Если последний не является указателем функции, он может быть лишь
SIG_DEF,
что означает «восстановить действие по умолчанию», либо
SIG_IGN
, что означает «игнорировать сигнал».

signal
изменяет действие для
signum
и возвращает предыдущее действие. (Это дает вам возможность восстановить при желании предыдущее действие.) Возвращаемое значение может равняться также
SIG_ERR
, что указывает на произошедшую ошибку. (Некоторые сигналы невозможно перехватить или игнорировать; предоставление для них обработчика сигнала или неверный
signum
создают эту ошибку.) В табл. 10.1 перечислены сигналы, доступные под GNU/Linux, их числовые значения, действия по умолчанию для каждого, формальный стандарт или современная операционная система, которые их определяют, и смысл каждого.

Таблица 10.1.

Сигналы GNU/Linux

Поделиться:
Популярные книги

Наша навсегда

Зайцева Мария
2. Наша
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Наша навсегда

Алекс и Алекс

Афанасьев Семен
1. Алекс и Алекс
Фантастика:
боевая фантастика
6.83
рейтинг книги
Алекс и Алекс

Герой

Бубела Олег Николаевич
4. Совсем не герой
Фантастика:
фэнтези
попаданцы
9.26
рейтинг книги
Герой

Вечный. Книга V

Рокотов Алексей
5. Вечный
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Вечный. Книга V

Древесный маг Орловского княжества 5

Павлов Игорь Васильевич
5. Орловское княжество
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Древесный маг Орловского княжества 5

Камень. Книга 3

Минин Станислав
3. Камень
Фантастика:
фэнтези
боевая фантастика
8.58
рейтинг книги
Камень. Книга 3

Рассвет русского царства 3

Грехов Тимофей
3. Новая Русь
Фантастика:
историческое фэнтези
альтернативная история
5.00
рейтинг книги
Рассвет русского царства 3

Артефактор. Шаг в неизвестность

Седых Александр Иванович
1. Артефактор
Фантастика:
фэнтези
боевая фантастика
попаданцы
6.12
рейтинг книги
Артефактор. Шаг в неизвестность

Мастер порталов

Лисина Александра
8. Гибрид
Фантастика:
боевая фантастика
попаданцы
технофэнтези
аниме
фэнтези
5.00
рейтинг книги
Мастер порталов

На границе империй. Том 6

INDIGO
6. Фортуна дама переменчивая
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.31
рейтинг книги
На границе империй. Том 6

Девятый

Каменистый Артем
1. Девятый
Фантастика:
боевая фантастика
попаданцы
9.15
рейтинг книги
Девятый

Газлайтер. Том 2

Володин Григорий
2. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 2

Хозяин Теней 6

Петров Максим Николаевич
6. Безбожник
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Хозяин Теней 6

Вечная Война. Книга II

Винокуров Юрий
2. Вечная война.
Фантастика:
юмористическая фантастика
космическая фантастика
8.37
рейтинг книги
Вечная Война. Книга II
Имя Значение По умолчанию Источник Смысл
SIGHUP
1 Term POSIX Отсоединение
SIGINT
2 Term ISO C Прерывание
SIGQUIT
3 Core POSIX Выход
SIGILL
4 Core ISO C Недействительная инструкция
SIGTRAP
5 Core POSIX Трассировочная ловушка
SIGABRT
6 Core ISO C Прекращение
SIGIOT
6 Core BSD Ловушка IOT
SIGBUS
7 Core BSD Ошибка шины
SIGFPE
8 Core ISO C Исключение с плавающей точкой
SIGKILL
9 Term POSIX Завершение, неблокируемый
SIGUSR1
10 Term POSIX Сигнал 1 пользователя
SIGSEGV
11 Core ISO C Нарушение сегмента
SIGUSR2
12 Term POSIX Сигнал 2 пользователя
SIGPIPE
13 Term POSIX Нарушенный канал
SIGALRM
14 Term POSIX Аварийные часы
SIGTERM
15 Term ISO C Завершение
SIGSTKFLT
16 Term Linux Ошибка стека в процессоре (не используется)
SIGCHLD
17 Ignr POSIX Изменение статуса порожденного процесса
SIGCLD
17 Ignr System V То же, что и SIGCHLD (для совместимости)
SIGCONT
18 POSIX Продолжить при остановке
SIGSTOP
19 Stop POSIX Стоп, неблокируемый
SIGTSTP
20 Stop POSIX Стоп от клавиатуры
SIGTTIN
21 Slop POSIX Фоновое чтение от tty
SIGTTOU
22 Stop POSIX Фоновая запись в tty
SIGURG
23 Ignr BSD Срочный сигнал сокета