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


              

Вызов tcsetattr установит новое состояние


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.

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