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



         

Описание - часть 2


uses linux,stdio;

const

  TIMEOUT=5;           (* время в секундах *)

  MAXTRIES=5;          (* число попыток *)

  LINESIZE=100;        (* длина строки *)

  CTRL_G=#7;           (* ASCII символ звукового сигнала *)

var

  (* Флаг, определяющий, истекло ли заданное время *)

  timed_out:boolean;

  (* Переменная, которая будет содержать введенную строку *)

  answer:array [0..LINESIZE-1] of char;

(* Выполняется при получении сигнала SIGALRM *)

procedure catch (sig:integer);cdecl;

begin

  (* Установить флаг timed_out *)

  timed_out := TRUE;

  (* Подать звуковой сигнал *)

  write(CTRL_G);

end;

function quickreply(prompt:pchar):pchar;

var

  ntries:integer;

  act, oact:sigactionrec;

begin

  (* Перехватить сигнал SIGALRM и сохранить старый обработчик *)

  act.handler.sh := @catch;

  sigaction (SIGALRM, @act, @oact);

  for ntries:=1 to MAXTRIES do

  begin

    timed_out := FALSE;

    writeln;

    write(prompt, ' > ');

    (* Установить таймер *)

    alarm (TIMEOUT);

    (* Получить введенную строку *)

    gets (answer);

    (* Выключить таймер *)

    alarm (0);

    (* Если флаг timed_out равен TRUE, завершить работу *)

    if not timed_out then

      break;

  end;

  (* Восстановить старый обработчик *)

  sigaction (SIGALRM, @oact, nil);

  (* Вернуть соответствующее значение *)

  if ntries = MAXTRIES then

    quickreply:=nil

  else quickreply:=answer;

end;

begin

  writeln;

  writeln(quickreply ('Reply'));

end.




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