[<<Previous Entry] [^^Up^^] [Next Entry>>] [Menu] [About The Guide]
 Задержка процесса до сигнала

Системный  вызов   pause(2)   задерживает   исполнение   процесса   на
неопределенное время  до момента, пока не возникнет сигнал, реакция на
который не установлена в игнорирование.

Часто  pause(2)  используется  вместе  с  alarm(2).  Если  прекращение
pause(2)  было  вызвано  сигналом,  отличным  от  SIGALRM,  необходимо
сбросить будильник  вызовом alarm(2) с нулевым аргументом. Иначе, ваша
программа будет  вести себя  непредсказуемым образом  из-за  получения
"дополнительного"  сигнала.   Заметьте,  что   alarm(2)   может   быть
использован вместе  с другими  системными вызовами, такими как read(2)
или wait(2).
                     ЗАДЕРЖКА ПРОЦЕССА ДО СИГНАЛА

pause(2)

ИМЯ

          pause - задержать процесс до сигнала

ИСПОЛЬЗОВАНИЕ

          #include <unistd.h>

          pause (void);

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

          -1 и errno установлена
     Задержка исполнения на заданный промежуток времени - Пример

Этот пример  - упрощенная  версия библиотечной  функции sleep(3C).  Он
демонстрирует совместное  использование системных  вызовов alarm(2)  и
pause(2). longjmp(3)  используется для  возврата из  функции обработки
сигнала.

12        Устанавливается  функция   обработки  для  сигнала  SIGALRM,
          текущая установка реакции запоминается.

13        Если  это   был  прямой   вызов  setjmp(3),  то  выполняются
          операторы внутри  if. Иначе,  если мы  вернулись сюда  через
          longjmp(3), возвращаемое  значение будет  ненулевым,  и  if-
          операторы выполняться не будет.

14-15     Эти строки  кода устанавливают интервал времени. setjmp(3) и
          longjmp(3)  используются,   потому   что   после   установки
          будильника существует  вероятность, что  сигнал возникнет до
          вызова  pause(2).  В  этом  случае  процесс  будет  задержан
          навсегда. Однако,  при использовании  longjmp(3)  в  функции
          обработки сигнала,  передача управления  назад  к  setjmp(3)
          происходит всегда, независимо от того, была вызвана pause(2)
          или нет.

17        Если unslept  положительна, значит  возврат из  pause(2) был
          вызван каким-то  другим сигналом,  а не SIGALRM. Кроме того,
          будильник  выключается,  чтобы  предотвратить  нежелательный
          сигнал SIGALRM.  Таким образом,  эта строка служит не только
          для получения количества "недоспанного" времени.

23-27     Это функция  обработки сигнала  SIGALRM. Заметьте,  что  это
          статическая функция,  так что  она будет  локальной  в  этом
          файле исходного  кода. Передача управления назад к setjmp(3)
          обсуждалась выше.

Эта программа тестируется следующим драйвером:
   30          #ifdef DEBUG
   31          main(int argc, char **argv)
   32          {
   33          int  unslept, mysleep(int);
   34          void sigint();
   35
   36          signal(SIGINT, sigint);
   37          unslept = mysleep(atoi(argv[1]));
   38          printf("remaining time: %d\n", unslept);
   39          }
   40
   41       void sigint() {}
   42      #endif

Файл: mysleep.c
     ЗАДЕРЖКА ИСПОЛНЕНИЯ НА ЗАДАННЫЙ ПРОМЕЖУТОК ВРЕМЕНИ - ПРИМЕР

 1        #include <signal.h>
 2        #include <setjmp.h>
 3        #include <stdlib.h>
 4
 5        static jmp_buf env;
 6
 7        mysleep(int seconds)
 8        {
 9        void sigcatch(int), (*astat)(int);
10        int unslept = seconds;
11
12        astat = signal(SIGALRM, sigcatch);
13        if (setjmp(env) == 0)  {
14        alarm(seconds);
15        pause();
16        }
17        unslept = alarm(0);
18        signal(SIGALRM, astat);
19        return(unslept);
20        }
21
22
23        static void sigcatch(int sig)
24        {
25        longjmp(env, 1);
26        }
27