ВУЗ:
Составители:
29
Ожидание сигнала
Если программа управляется внешними событиями или использует сигналы для
синхронизации, то целесообразно вместо постоянной проверки флага, указывающего на
появление сигнала использовать функцию ожидания поступления сигнала.
int pause()
Функция приостанавливает выполнение программы до прихода сигнала,
который вызывает выполнение обработчика или прерывание выполнения процесса.
Если сигнал вызывает обработчик, то функция всегда возвращает значение –1, а errno
принимает следующее значение:
EINTR Функция прервана приходом сигнала.
В случае прекращения выполнения процесса функция не возвращает никакого
значения. Функция определена в заголовочном файле <unistd.h>.
Однако, при использовании этой функции возникает серьезная проблема
безопасности работы программы. pause безопасно может быть использована только в
программе, которая в основном теле программы только вызывает саму функцию pause,
а всю полезную работу выполняет обработчик события. Например, в следующем
фрагменте программы
/* `usr_interrupt' устанавливается обработчиком сигнала. */
if (!usr_interrupt)
pause ();
/* Выполняется работа, при приходе сигнала. */
...
Сигнал может поступить после того, как проверена переменная, но до вызова
pause. Если более не поступит ни одного сигнала, программа никогда не восстановит
работоспособность.
Можно установить максимальное время ожидания с помощью функции sleep:
while (!usr_interrupt)
sleep (1);
...
Однако, и такой способ подходит не во всех случаях. Наиболее безопасным
способом ожидания сигнала является использование функции sigsuspend:
int sigsuspend(sigset_t *SET)
Функция заменяет маску сигналов процесса и приостанавливает его работу до
поступления одного из сигналов, который не заблокирован маской. Маска, задаваемая
SET действует только на время ожидания, вызываемому функцией, после возвращения
управления процессу восстанавливается старая маска сигналов. Использование
sigsuspend в следующем примере абсолютно безопасно:
sigset_t mask, oldmask;
...
/* Устанавливается маска сигналов. */
sigemptyset (&mask);
sigaddset (&mask, SIGUSR1);
...
/* Ожидается приход сигналов. */
sigprocmask (SIG_BLOCK, &mask, &oldmask);
while (!usr_interrupt)
sigsuspend (&oldmask);
sigprocmask (SIG_UNBLOCK, &mask, NULL);
Ожидание сигнала
Если программа управляется внешними событиями или использует сигналы для
синхронизации, то целесообразно вместо постоянной проверки флага, указывающего на
появление сигнала использовать функцию ожидания поступления сигнала.
int pause()
Функция приостанавливает выполнение программы до прихода сигнала,
который вызывает выполнение обработчика или прерывание выполнения процесса.
Если сигнал вызывает обработчик, то функция всегда возвращает значение –1, а errno
принимает следующее значение:
EINTR Функция прервана приходом сигнала.
В случае прекращения выполнения процесса функция не возвращает никакого
значения. Функция определена в заголовочном файле .
Однако, при использовании этой функции возникает серьезная проблема
безопасности работы программы. pause безопасно может быть использована только в
программе, которая в основном теле программы только вызывает саму функцию pause,
а всю полезную работу выполняет обработчик события. Например, в следующем
фрагменте программы
/* `usr_interrupt' устанавливается обработчиком сигнала. */
if (!usr_interrupt)
pause ();
/* Выполняется работа, при приходе сигнала. */
...
Сигнал может поступить после того, как проверена переменная, но до вызова
pause. Если более не поступит ни одного сигнала, программа никогда не восстановит
работоспособность.
Можно установить максимальное время ожидания с помощью функции sleep:
while (!usr_interrupt)
sleep (1);
...
Однако, и такой способ подходит не во всех случаях. Наиболее безопасным
способом ожидания сигнала является использование функции sigsuspend:
int sigsuspend(sigset_t *SET)
Функция заменяет маску сигналов процесса и приостанавливает его работу до
поступления одного из сигналов, который не заблокирован маской. Маска, задаваемая
SET действует только на время ожидания, вызываемому функцией, после возвращения
управления процессу восстанавливается старая маска сигналов. Использование
sigsuspend в следующем примере абсолютно безопасно:
sigset_t mask, oldmask;
...
/* Устанавливается маска сигналов. */
sigemptyset (&mask);
sigaddset (&mask, SIGUSR1);
...
/* Ожидается приход сигналов. */
sigprocmask (SIG_BLOCK, &mask, &oldmask);
while (!usr_interrupt)
sigsuspend (&oldmask);
sigprocmask (SIG_UNBLOCK, &mask, NULL);
29
Страницы
- « первая
- ‹ предыдущая
- …
- 27
- 28
- 29
- 30
- 31
- …
- следующая ›
- последняя »
