Студопедия — СИНТАКСИС
Студопедия Главная Случайная страница Обратная связь

Разделы: Автомобили Астрономия Биология География Дом и сад Другие языки Другое Информатика История Культура Литература Логика Математика Медицина Металлургия Механика Образование Охрана труда Педагогика Политика Право Психология Религия Риторика Социология Спорт Строительство Технология Туризм Физика Философия Финансы Химия Черчение Экология Экономика Электроника

СИНТАКСИС






typedef void (*sighandler_t)(int);

sighandler_t signal(int signum,

sighandler_t handler );

#include <signal.h> void (*signal (int sig, void (*func)(int))) (int);

ОПИСАНИЕ
Системный вызов signal позволяет вызывающему процессу выбрать один из трех возможных способов реакции на получение определенного сигнала. Аргументы sig и func специфицируют, соответственно, сигнал и выбор.

Аргумент sig может иметь одно из следующих значений, за исключением SIGKILL:

SIGHUP     Освобождение линии (hangup).
SIGINT     Прерывание (interrupt).
SIGQUIT   [1] Выход (quit).
SIGILL   [1] Некорректная команда (illegal instruction). Не переустанавливается при перехвате.
SIGTRAP   [1] Трассировочное прерывание (trace trap). Не переустанавливается при перехвате.
SIGIOT   [1] Машинная команда IOT.
SIGABRT   [1] Рекомендуемый синоним предыдущего.
SIGEMT   [1] Машинная команда EMT.
SIGFPE   [1] Исключительная ситуация при выполнении операции с вещественными числами (floating-point exception).
SIGKILL     Уничтожение процесса (kill). Не перехватывается и не игнорируется.
SIGBUS   [1] Ошибка шины (bus error).
SIGSEGV   [1] Некорректное обращение к сегменту памяти (segmentation violation).
SIGSYS   [1] Некорректный параметр системного вызова (bad argument to system call).
SIGPIPE     Запись в канал, из которого некому читать (write on a pipe with no one to read it).
SIGALRM     Будильник (alarm clock).
SIGTERM     Программный сигнал завершения (software termination signal).
SIGUSR1     Определяемый пользователем сигнал 1 (user-defined signal 1).
SIGUSR2     Определяемый пользователем сигнал 2 (user-defined signal 2).
SIGCHLD   [2] Завершение порожденного процесса (death of a child).
SIGPWR   [2] Ошибка питания (power fail).
SIGPOLL   [3] Регистрация выборочного события (selectable event pending).

Аргумент func может иметь одно из трех значений: SIG_DFL, SIG_IGN или адрес_функции. Макросы SIG_DFL и SIG_IGN определены во включаемом файле <signal.h>. Каждый из макросов порождает уникальную константу типа "указатель на функцию типа void", заведомо не соответствующую определяемой функции.

Действия, предписываемые аргументом func, состоят в следующем:

SIG_DFL - стандартная реакция на сигнал

При получении сигнала sig терминировать процесс со всеми завершающими действиями, описанными в exit(2); см. замечание [1] ниже.

SIG_IGN - игнорирование сигнала

Игнорировать сигнал sig. Сигнал SIGKILL не может игнорироваться.

адрес_функции - перехват сигнала

При получении сигнала sig выполнить функцию обработки сигнала func; в качестве единственного аргумента функции func передается номер сигнала sig; дополнительные аргументы передаются для сигналов, вырабатываемых аппаратурой. Перед выполнением функции func устанавливается стандартная реакция на полученный сигнал, если только этот сигнал не есть SIGILL или SIGTRAP. Таким образом, чтобы перехватить следующий сигнал sig, нужно вновь обратиться к signal, задав в качестве аргумента func адрес_функции.

После завершения функции обработки сигнала процесс, получивший сигнал, возобновляет выполнение с точки прерывания.

Если сигнал, который должен быть перехвачен, поступил во время выполнения системных вызовов read(2), write(2), open(2) или ioctl(2) для медленных устройств (таких, как терминал, но не дисковый файл), pause(2) или системного вызова wait(2), который не возвращает немедленно управление из-за того, что порожденный процесс остановлен или терминирован, то функция обработки сигнала выполняется, а затем прерванный системный вызов, скорее всего, возвращает вызывающему процессу значение -1 и присваивает переменной errno значение EINTR.

Системный вызов signal не проверяет корректность аргумента func. Последствия выполнения функции обработки сигнала, заданной некорректным адресом, непредсказуемы.

Сигнал SIGKILL перехватить нельзя.

Выполнение системного вызова signal отменяет полученный, но еще не обработанный сигнал sig, если только этот сигнал не есть SIGKILL.

Системный вызов signal завершается неудачей, если:

[EINVAL]

Значение аргумента sig является недопустимым номером сигнала, включая SIGKILL.

ПРИМЕЧАНИЯ
[1]

Если для сигналов, помеченных

[1], назначается стандартная реакция (SIG_DFL), то в дополнение к тому, что процесс терминируется, в текущем рабочем каталоге создается файл с образом памяти, если выполняются следующие условия:

1. Действующий и реальный идентификаторы пользователя процесса, получившего сигнал, совпадают.

2. Обычный файл с именем core существует и в него можно писать, или файл core может быть создан; создаваемый файл core будет обладать следующими характеристиками:

2. Режим доступа 0666, модифицированный маской режима создания файлов [см. umask(2)].

3. Идентификатор владельца файла равен действующему идентификатору пользователя процесса, получившего сигнал.

4. Идентификатор группы файла равен действующему идентификатору группы процесса, получившего сигнал.

[2]

Для сигналов SIGCHLD и SIGPWR, как и для других, в качестве func может использоваться одно из трех значений: SIG_DFL, SIG_IGN или адрес функции обработки сигнала. Однако действия, предписываемые этими значениями, отличаются от описанных выше:

SIG_DFL - игнорирование сигнала
SIG_IGN - игнорирование сигнала

Если значение sig равно SIGCHLD, то процессы, порожденные вызывающим процессом, не перейдут в состояние зомби при своем завершении [см. exit(2)].

адрес_функции - перехват сигнала
Если получен сигнал SIGCHLD, то на время выполнения функции обработки сигнала любой другой сигнал SIGCHLD игнорируется.

Сигнал SIGCHLD взаимодействует с системными вызовами wait и exit следующим образом:

wait

Если значение func для сигнала SIGCHLD установлено равным SIG_IGN и выполняется системный вызов wait, то после получения сигнала SIGCHLD wait блокируется до завершения всех процессов, порожденных вызывающим процессом; затем wait возвращает -1, а переменной errno присваивается значение ECHILD.

exit

Если процесс, родительский по отношению к процессу, выполняющему exit, установил для сигнала SIGCHLD действие SIG_IGN, то завершающийся процесс не переходит в состояние зомби.

При использовании конвейера следует иметь в виду, что интерпретатор команд shell делает последний процесс конвейера родительским для предшествующих процессов. Процесс, который входит в конвейер (и таким образом может стать родительским процессом), не должен перехватывать сигнал SIGCHLD.

[3]

Сигнал SIGPOLL посылается, когда для дескриптора файла, соответствующего псевдоустройству [см. intro(2)], установлена регистрация выборочных событий. Процесс должен специально запрашивать посылку этого сигнала посредством системного вызова ioctl с аргументом I_SETSIG, иначе сигнал SIGPOLL никогда не будет получен.

ДИАГНОСТИКА
При успешном завершении системного вызова signal возвращается предыдущее значение func для указанного сигнала sig. В противном случае возвращается значение SIG_ERR, а переменной errno функция не присваивает код ошибки. Значение SIG_ERR определено во включаемом файле <sys/signal.h>.

СЮРПРИЗЫ
При попытке изменить стандартную реакцию на сигнал SIGKILL возвращается значение SIG_DFL (а не SIG_ERR, как должно быть), а переменная errno получает значение EINVAL.

 

 

#include <signal.h>;

#include <stdlib.h>;

#include <stdio.h>;

#include <unistd.h>;

static void sig_hand(int signo)

{

signal (signo, sig_hand);

if (signo == SIGINT)

printf(“получен сигнал SIGINT ”);

else if (signo == SIGTERM)

printf(“ получен сигнал SIGTERM”);

else {

printf(“неописанный сигнал”); exit(EXIT_FAILURE);

}

exit(EXIT_SUCCESS);}

int main()

{

if (signal (SIGINT, sig_hand) == SIG_ERR)

{

printf(“ошибка SIGINT”);

exit(-1);

}

if (signal(SIGTERM, sig_hand) == SIR_ERR)

{

printf(“ошибка SIGTERM”);

exit(-2);

}

if (signal(SIGHUP, SIG_IGN) == SIR_ERR)

{

printf(“невозможно игнорировать SIGHUP”);

exit(-3);

}

for (;;) pause();

exit (0);

}

 

 

pause - ожидает сигнал







Дата добавления: 2015-08-12; просмотров: 449. Нарушение авторских прав; Мы поможем в написании вашей работы!



Важнейшие способы обработки и анализа рядов динамики Не во всех случаях эмпирические данные рядов динамики позволяют определить тенденцию изменения явления во времени...

ТЕОРЕТИЧЕСКАЯ МЕХАНИКА Статика является частью теоретической механики, изучающей условия, при ко­торых тело находится под действием заданной системы сил...

Теория усилителей. Схема Основная масса современных аналоговых и аналого-цифровых электронных устройств выполняется на специализированных микросхемах...

Логические цифровые микросхемы Более сложные элементы цифровой схемотехники (триггеры, мультиплексоры, декодеры и т.д.) не имеют...

Признаки классификации безопасности Можно выделить следующие признаки классификации безопасности. 1. По признаку масштабности принято различать следующие относительно самостоятельные геополитические уровни и виды безопасности. 1.1. Международная безопасность (глобальная и...

Прием и регистрация больных Пути госпитализации больных в стационар могут быть различны. В цен­тральное приемное отделение больные могут быть доставлены: 1) машиной скорой медицинской помощи в случае возникновения остро­го или обострения хронического заболевания...

ПУНКЦИЯ И КАТЕТЕРИЗАЦИЯ ПОДКЛЮЧИЧНОЙ ВЕНЫ   Пункцию и катетеризацию подключичной вены обычно производит хирург или анестезиолог, иногда — специально обученный терапевт...

Патристика и схоластика как этап в средневековой философии Основной задачей теологии является толкование Священного писания, доказательство существования Бога и формулировка догматов Церкви...

Основные симптомы при заболеваниях органов кровообращения При болезнях органов кровообращения больные могут предъявлять различные жалобы: боли в области сердца и за грудиной, одышка, сердцебиение, перебои в сердце, удушье, отеки, цианоз головная боль, увеличение печени, слабость...

Вопрос 1. Коллективные средства защиты: вентиляция, освещение, защита от шума и вибрации Коллективные средства защиты: вентиляция, освещение, защита от шума и вибрации К коллективным средствам защиты относятся: вентиляция, отопление, освещение, защита от шума и вибрации...

Studopedia.info - Студопедия - 2014-2024 год . (0.012 сек.) русская версия | украинская версия