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

UptoLike

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

23
if (signal(SIGTERM, termination_handler) == SIG_IGN)
signal(SIGTERM, SIG_IGN);
. . .
}
Функция sigaction имеет то же назначение, что и signal, однако предоставляет
больший контроль над процессом обработки сигналов. Функция определена в
заголовочном файле <signal.h>.
int sigaction(int SIGNUM, const struct sigaction *ACTION,
struct sigaction *OLD_ACTION)
Структура sigaction определяется следующим образом:
struct sigaction {
int sa_flags;
sighandler_t sa_handler;
sigset_t sa_mask;
};
sa_handler используется таким же образом, как и аргумент ACTION в функции
signal; sa_mask задает список сигналов, которые должны быть заблокированы при
выполнении обработчика; sa_flags задает значения флагов, которые влияют на
поведение сигнала.
Аргумент ACTION задает новый обработчик для сигнала, OLD_ACTION
используется для того, чтобы возвратить информацию об обработчике,
ассоциированном с сигналом. Если OLD_ACTION является нулевым указателям,
информация о предыдущем обработчике не возвращается. Если ACTION является
нулевым указателем, обработчик сигнала не изменяется.
Функция возвращает следующие значения:
0 в случае успеха;
-1 в случае ошибки;
EINVAL в случае неправильно заданного идентификатора сигнала.
Пример использования функции sigaction:
#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)
{
...
struct sigaction new_action, old_action;
new_action.sa_handler = termination_handler;
sigemptyset (&new_action.sa_mask);
new_action.sa_flags = 0;
sigaction (SIGINT, NULL, &old_action);
if (old_action.sa_handler != SIG_IGN)
sigaction (SIGINT, &new_action, NULL);
sigaction (SIGHUP, NULL, &old_action);
if (old_action.sa_handler != SIG_IGN)
sigaction (SIGHUP, &new_action, NULL);
sigaction (SIGTERM, NULL, &old_action);
             if (signal(SIGTERM, termination_handler) == SIG_IGN)
                   signal(SIGTERM, SIG_IGN);
             . . .
       }

        Функция sigaction имеет то же назначение, что и signal, однако предоставляет
больший контроль над процессом обработки сигналов. Функция определена в
заголовочном файле .
       int sigaction(int SIGNUM, const struct sigaction *ACTION,
            struct sigaction *OLD_ACTION)
       Структура sigaction определяется следующим образом:
       struct sigaction {
         int sa_flags;
         sighandler_t sa_handler;
         sigset_t sa_mask;
       };
         sa_handler используется таким же образом, как и аргумент ACTION в функции
signal; sa_mask задает список сигналов, которые должны быть заблокированы при
выполнении обработчика; sa_flags задает значения флагов, которые влияют на
поведение сигнала.
         Аргумент ACTION задает новый обработчик для сигнала, OLD_ACTION
используется для того, чтобы возвратить информацию об обработчике,
ассоциированном с сигналом. Если OLD_ACTION является нулевым указателям,
информация о предыдущем обработчике не возвращается. Если ACTION является
нулевым указателем, обработчик сигнала не изменяется.
         Функция возвращает следующие значения:
0            в случае успеха;
-1           в случае ошибки;
EINVAL       в случае неправильно заданного идентификатора сигнала.
         Пример использования функции sigaction:

             #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)
             {
               ...
               struct sigaction new_action, old_action;

                 new_action.sa_handler = termination_handler;
                 sigemptyset (&new_action.sa_mask);
                 new_action.sa_flags = 0;

                 sigaction (SIGINT, NULL, &old_action);
                 if (old_action.sa_handler != SIG_IGN)
                   sigaction (SIGINT, &new_action, NULL);
                 sigaction (SIGHUP, NULL, &old_action);
                 if (old_action.sa_handler != SIG_IGN)
                   sigaction (SIGHUP, &new_action, NULL);
                 sigaction (SIGTERM, NULL, &old_action);


                                                                                 23