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


Псевдотерминалы - часть 2


Хотя средства, при помощи которых выполняется инициализация псевдотерминалов, были улучшены в новых версиях ОС

UNIX и спецификации XSI, они все еще остаются довольно громоздкими. Система UNIX обеспечивает конечное число псевдотерминалов, и процесс командного интерпретатора должен открыть следующий доступный псевдотерминал. В системе SVR4 это выполняется и помощи открытия устройства /dev/ptmx, которое определяет и открывает первое неиспользуемое ведущее устройство псевдотерминала. С каждым ведущим устройством связано ведомое устройство. Для того, чтобы предотвратить открытие ведомого устройства другим процессом, открытие устройства /dev/ptmx также блокирует соответствующее ведомое устройство.

uses linux;

var

  mfd:longint;

.

.

.

  (* Открыть псевдотерминал -

   * получить дескриптор файла главного устройства *)

  masterfd := fdopen ('/dev/ptmx', Open_RDWR);

  if masterfd = -1 then

  begin

    perror('Ошибка при открытии главного устройства');

    halt(1);

  end;

Перед тем как открыть и «разблокировать» ведомое устройство, необходимо убедиться, что только один процесс с соответствующими правами доступа сможет выполнять чтение из устройства и запись в него. Функция grantpt изменяет режим доступа и идентификатор владельца ведомого устройства в соответствии с параметрами связанного с ним главного устройства. Функция unlockpt снимает флаг, блокирующий ведомое устройство (то есть делает его доступным). Далее нужно открыть ведомое устройство. Но его имя пока еще не известно. Функция ptsname возвращает имя ведомого устройства, связанного с заданным ведущим устройством, которое обычно имеет вид /dev/pts/pttyXX. Следующий фрагмент демонстрирует последовательность необходимых действий:

uses stdio, linux;

 

var

  mfd, sfd:longint;

  slavenm:pchar;

.

.

.

(* Открываем ведущее устройство, как и раньше *)

mfd := fdopen ('/dev/ptmx', Open_RDWR);

if mfd = -1 then

begin

  perror('Ошибка при открытии ведущего устройства');

  halt(1);

end;

(* Изменяем права доступа ведомого устройства *)




- Начало -  - Назад -  - Вперед -



Книжный магазин