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



              

Описание


uses linux;

Function TCSetAttr(ttyfd:longint; actions:longint; var tnew:TermIOS):

         Boolean;

Вызов tcsetattr установит новое состояние дисциплины связи, заданное структурой tnew. Второй параметр вызова tcsetattr, переменная actions, определяет, как и когда будут установлены новые атрибуты терминала. Существует три возможных варианта, определенных в файле linux:

ТСSANOW

Немедленное выполнение изменений, что может вызвать проблемы, если в момент изменения флагов драйвер терминала выполняет вывод на терминал

TCSADRAIN

Выполняет ту же функцию, что и TCSANOW, но перед установкой новых параметров ждет опустошения очереди вывода

TCSAFLUSH

Аналогично TCSADRAIN ждет, пока очередь вывода не опустеет, а затем также очищает и очередь ввода перед установкой для параметров дисциплины линии связи значений, заданных в структуре tnew

Следующие две функции используют описанные вызовы. Функция tsave сохраняет текущие параметры, связанные с управляющим терминалом процесса, а функция tback восстанавливает последний набор сохраненных параметров. Флаг saved используется для предотвращения восстановления установок функцией tback, если перед этим не была использована функция tsave.

(* Структура tsaved будет содержать параметры терминала *)

var

  tsaved:termios;

(* Равно TRUE если параметры сохранены *)

const

  saved:boolean=false;

function tsave:boolean;

begin

  if isatty(0) and tcgetattr(0,tsaved) then

  begin

    saved := true;

    tsave := true;

    exit;

  end;

  tsave := false;

end;

function tback:boolean; (* Восстанавливает состояние терминала *)

begin

  if not isatty(0) or not saved then

    tback:=false

  else

    tback:=tcsetattr(0, TCSAFLUSH, tsaved);

end;

Между этими двумя процедурами может быть заключен участок кода, который временно изменяет состояние терминала, например:

uses linux;

begin

  if not tsave then

  begin

    writeln(stderr, 'Невозможно сохранить параметры терминала');

    halt(1);

  end;

  (* Интересующий нас участок *)

  tback;

  halt(0);

end.




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