Лекции по курсу "Системное программирование для UNIX". Литвинов Д.Г. - 22 стр.

UptoLike

Составители: 

22
количества строк и столбцов терминального окна.
Сообщения сигналов
За каждым сигналом закреплено определенное текстовое сообщение,
описывающее причину его возникновения. Для получения этого сообщения в Linux
предусмотрены следущие функции:
char * strsignal(int SIGNUM)
Возвращает указатель на статически размещенную строку, описывающую
сигнал SIGNUM.
void psignal(int SIGNUM, char *MESSAGE)
Печатает текстовое сообщение в стандартный поток вывода. ‘stderr’. Если
MESSAGE не является нулевым указателем, функция предваряет сообщение
содержимым этой строки.
Обе функции определены в заголовочном файле <signal.h>.
Определение обработчика сигнала
Наиболее простым способом определить обработчик сигнала является
использование функции signal. Ее определение находится в заголовочном файле
<signal.h>.
sighandler_t signal(int SIGNUM, sighandler_t ACTION)
sighandler_t – тип функций обработки сигналов (используется только в Linux).
Таким образом, можно определить обработчик следующим образом:
void HANDLER (int signum) {. . .}
Аргумент SIGNUM определяет сигнал, который будет обрабатываться. Сигнал
необходимо указывать в виде символьного обозначения, так как соответствующие
числовые идентификаторы могут различаться в различных операционных системах.
Аргумент ACTION указывает на действие, которое будет выполняться при появлении
сигнала. Аргумент может принимать следующие значения:
SIG_DFL Действие по умолчанию.
SIG_IGN Сигнал игнорируется.
HANDLER Определяет адрес функции-обработчика.
Функция signal возвращает то действие, которое использовалось для заданного
сигнала до выполнения функции. При возникновении ошибки возвращается значение
SIG_ERR, при задании неправильного идентификатора сигнала возвращаемое значение
равно EINVAL.
Пример использования обработчика сигналов для удаления временных файлов
при фатальных ошибках:
#include <signal.h>
void termination_handler(int signum)
{
struct temp_file *p;
for (p = temp_file_list; p; p = p->next())
unlink(p->name);
}
int main(void)
{
. . .
if (signal(SIGINT, termination_handler) == SIG_IGN)
signal(SIGINT, SIG_IGN);
if (signal(SIGHUP, termination_handler) == SIG_IGN)
signal(SIGINT, SIG_IGN);
                количества строк и столбцов терминального окна.

       Сообщения сигналов
       За каждым сигналом закреплено определенное текстовое сообщение,
описывающее причину его возникновения. Для получения этого сообщения в Linux
предусмотрены следущие функции:
       char * strsignal(int SIGNUM)
        Возвращает указатель на статически размещенную строку, описывающую
сигнал SIGNUM.
       void psignal(int SIGNUM, char *MESSAGE)
       Печатает текстовое сообщение в стандартный поток вывода. ‘stderr’. Если
MESSAGE не является нулевым указателем, функция предваряет сообщение
содержимым этой строки.
       Обе функции определены в заголовочном файле .

         Определение обработчика сигнала
         Наиболее простым способом определить обработчик сигнала является
использование функции signal. Ее определение находится в заголовочном файле
.
       sighandler_t signal(int SIGNUM, sighandler_t ACTION)
       sighandler_t – тип функций обработки сигналов (используется только в Linux).
       Таким образом, можно определить обработчик следующим образом:
       void HANDLER (int signum) {. . .}
        Аргумент SIGNUM определяет сигнал, который будет обрабатываться. Сигнал
необходимо указывать в виде символьного обозначения, так как соответствующие
числовые идентификаторы могут различаться в различных операционных системах.
Аргумент ACTION указывает на действие, которое будет выполняться при появлении
сигнала. Аргумент может принимать следующие значения:
SIG_DFL       Действие по умолчанию.
SIG_IGN       Сигнал игнорируется.
HANDLER       Определяет адрес функции-обработчика.
        Функция signal возвращает то действие, которое использовалось для заданного
сигнала до выполнения функции. При возникновении ошибки возвращается значение
SIG_ERR, при задании неправильного идентификатора сигнала возвращаемое значение
равно EINVAL.
        Пример использования обработчика сигналов для удаления временных файлов
при фатальных ошибках:

       #include 

       void termination_handler(int signum)
       {
            struct temp_file *p;
            for (p = temp_file_list; p; p = p->next())
                  unlink(p->name);
       }

       int main(void)
       {
            . . .
            if (signal(SIGINT, termination_handler) == SIG_IGN)
                  signal(SIGINT, SIG_IGN);
            if (signal(SIGHUP, termination_handler) == SIG_IGN)
                  signal(SIGINT, SIG_IGN);



       22