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


         

в объекте типа sigjmp_buf, определенном


uses stdio;
(* Сохранить текущее положение в программе *)
function sigsetjmp(var env:jmp_buf;savemask:longint):integer;
(* Вернуться в сохраненную позицию *)
procedure siglongjmp(var env:jmp_buf;val:integer);
Текущее состояние программы сохраняется в объекте типа sigjmp_buf, определенном в файле stdio. Если во время вызова sigsetjmp значение аргумента savemask не равно нулю, то вызов sigsetjmp сохранит помимо основного контекста программы также текущую маску сигналов (маску блокированных сигналов и действия, связанные со всеми сигналами). Возвращаемое функцией sigsetjmp значение является важным: если в точку sigsetjmp управление переходит из функции siglongjmp, то она возвращает ненулевое значение – аргумент val вызова siglongjmp. Если же функция
sigsetjmp вызывается в обычном порядке исполнения программы, то она возвращает значение 0.
Следующий пример демонстрирует технику использования этих функций:
 (* Пример использования процедур sigsetjmp и siglongjmp *)
uses linux,stdio;
var
  position:sigjmp_buf;
procedure domenu;
var
  choice:integer;
begin
  write('Choice menu entry:'#$a' menu 1'#$a' menu 2'#$a' menu 3'#$a'?>');
  scanf('%d',[@choice]);
end;
procedure goback(smth:longint);cdecl;
begin
  fprintf (stderr, #$a'Прерывание'#$a, []);
  (* Вернуться в сохраненную позицию *)
  siglongjmp (position, 1);
end;
var
  act:sigactionrec;
begin
  (*
     .
     .
     . *)
  (* Сохранить текущее положение *)
  if sigsetjmp(position, 1) = 0 then
  begin
    act.handler.sh := @goback;
    sigaction (SIGINT, @act, nil);
  end;
  domenu;
  (*
   .
   .
   . *)
end.
Если пользователь нажимает на клавишу прерывания задания после вызова sigaction, то управление передается в точку, положение которой было записано при помощи функции sigsetjmp. Поэтому выполнение программы продолжается, как если бы только что завершился соответствующий вызов sigsetjmp. В этом случае возвращаемое функцией sigsetjmp значение будет равно второму параметру процедуры siglongjmp.

Содержание  Назад  Вперед