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

       

Системный вызов fdopen


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

fd := fdopen('/dev/tty0a', Open_RDWR);

Однако при попытке открыть терминал возврата из вызова не произойдет до тех пор, пока не будет установлено соединение. Для терминалов с модемным управлением это означает, что возврат из вызова не произойдет до тех пор, пока не будут установлены сигналы управления модемом и не получен сигнал «детектирования несущей», что может потребовать значительного времени либо вообще не произойти.

Следующая процедура использует вызов alarm (представленный в главе 6) для задания интервала ожидания, если возврат из вызова fdopen не произойдет за заданное время:

(* Процедура ttyopen - вызов fdopen с интервалом ожидания *)

uses stdio,linux;

const

  TIMEOUT=10;

  timeout_flag:boolean=FALSE;

  termname:pchar='';

procedure settimeout(value:longint);cdecl;

begin

  writeln(stderr, 'Превышено время ожидания ', termname);



  timeout_flag := TRUE;

end;

function ttyopen(filename:pchar; flags:longint):longint;

var

  fd:longint;

  act, oact:sigactionrec;

  mask:sigset_t;

begin

  fd := -1;

  termname := filename;

  (* Установить флаг таймаута *)

  timeout_flag := FALSE;

  (* Установить обработчик сигнала SIGALRM *)

  act.handler.sh := @settimeout;

  sigfillset(@mask);

  act.sa_mask:=mask.__val[0];

  sigaction(SIGALRM, @act, @oact);

  alarm(TIMEOUT);

  fd := fdopen(filename, flags);

  (* Сброс установок *)

  alarm(0);

  sigaction(SIGALRM, @oact, @act);

  if timeout_flag then

    ttyopen:=-1

  else

    ttyopen:=0;

end;



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