Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб.практикумСП.doc
Скачиваний:
39
Добавлен:
31.03.2015
Размер:
5.99 Mб
Скачать

13.3. Системный вызов signal

Использование системного вызова signal предоставляет процессу возможность самостоятельно определить свою реакцию на получение того или иного сигнала, изменив тем самым установку, которая была осуществлена ОС UNIX по умолчанию. Системный вызов signal имеет следующий формат:

#include <signal.h>

int (*signal(sig, func))()

int sig;

int (*func)();

Как видно из приведенного фрагмента исходного текста программы на языке Си, реакцией процесса, осуществившего системный вызов signal с аргументом func(), на получение им сигнала sig будет теперь осуществление вызова функции func. Напомним, что приведенное в этом фрагменте программы объявление функции func специфицирует ее тип данных как указатель на функцию, возвращающую целое значение.

Существуют две, так сказать, стандартные реакции процесса на получение им сигнала – это игнорирование полученного сигнала и восстановление стандартной, установленной самой ОС UNIX реакции. Обе эти возможности могут быть легко реализованы при использовании вместо аргумента func системного вызова signal символьных констант SIG_IGN и SIG_DFL соответственно. Если выполнение системного вызова signal удачно завершено, он возвращает значение, полученное в результате последнего вызова функции, вызываемой процессом при получении им указанного сигнала (это может быть либо объявленная ранее пользователем функция, либо функция, которая используется для этих целей ОС UNIX по умолчанию), в противном случае он возвращает целое число -1. Например, в результате выполнения фрагмента программы на языке Си

signal(SIGINT, SIG_IGN);

получаемые процессом и прерывающие его функционирование сигналы SIGINT будут игнорироваться. А в результате выполнения фрагмента программы на языке Си

signal(SIGINT, cleanup);

получение процессом, осуществившим такой системный вызов signal, сигнала SIGINT приведет к вызову реализованной пользователем функции cleanup, которая как мы уже говорили, должна иметь тип данных указатель на функцию, возвращающую целое. Функция func должна быть описана прежде, чем будет осуществлен системный вызов signal, так как в противном случае переменная cleanup, указанная в качестве его аргумента, будет обработана компилятором с языка Си как имеющая тип данных целое. Для этого рекомендуется придерживаться следующего формата системного вызова signal:

int (*cleanup)();

signal(SIGINT, cleanup);

13.4. Системный вызов pause

Использование системного вызова pause позволяет приостановить функционирование осуществившего его процесса до получения им некоторого сигнала. Ниже приведен формат системного вызова pause:

pause();

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