Системный вызов 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;