Системное программирование в UNIX средствами Free Pascal

       

какое действие он должен выполнять.


uses linux;
Procedure SigProcMask(How:Integer; SSet,OSSet:PSigSet);
Параметр how сообщает вызову
sigpromask, какое действие он должен выполнять. Например, этот параметр может иметь значение SIG_MASK, указывающее, что с этого момента будут блокироваться сигналы, заданные во втором параметр sset, то есть будет произведена установка маски блокирования сигналов. Третий параметр просто заполняется текущей маской блокируемых сигналов – если не нужно ее знать, просто присвойте этому параметру значение nil. Поясним это на примере:
var
  set1:sigset_t;
.
.
.
(* Создать полный набор сигналов *)
sigfillset (@set1);
(* Установить блокировку *)
sigprocmask (SIG_SETMASK, @set1, nil);


(* Критический участок кода .. *)
(* Отменить блокировку сигналов *)
sigprocmask (SIG_UNBLOCK, @set1, nil);
Обратите внимание на использование для отмены блокирования сигналов параметра SIG_UNBLOCK. Заметим, что если использовать в качестве первого параметра SIG_BLOCK вместо SIG_SETMASK, то это приведет к добавлению
заданных в переменной
set сигналов к текущему набору сигналов.
Следующий более сложный пример показывает, как сначала выполняется блокирование всех сигналов во время выполнения особенно важного участка программы, а затем, при выполнении менее критического участка, блокируются только сигналы SIGINT и SIGQUIT.
 (* Блокировка сигналов - демонстрирует вызов sigprocmask *)
uses linux,stdio;
var
  set1, set2:sigset_t;
begin
  (* Создать полный набор сигналов *)
  sigfillset (@set1);
  (* Создать набор сигналов, не включающий
   * сигналы SIGINT и SIGQUIT
   *)
  sigfillset (@set2);
  sigdelset (@set2, SIGINT);
  sigdelset (@set2, SIGQUIT);
  (* Некритический участок кода ... *)
  (* Установить блокировку всех сигналов *)
  sigprocmask (SIG_SETMASK, @set1, nil);
  (* Более критический участок кода ... *)
  (* Блокировка меньшего числа сигналов. *)
  sigprocmask (SIG_UNBLOCK, @set2, nil);
  (* Менее критический участок кода ... *)
  (* Отменить блокировку для всех сигналов *)
  sigprocmask (SIG_UNBLOCK, @set1, nil);
end.
Упражнение 6.2. Перепишите процедуру g_exit в примере 4 из раздела 6.2.2 так, чтобы во время ее выполнения игнорировались сигналы SIGINT и SIGQUIT.

Содержание раздела