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


         

и затем пытаемся открыть его


if grantpt (mfd) = -1 then

begin

  perror('Невозможно разрешить доступ к ведомому устройству');

  halt(1);

end;

(* Разблокируем ведомое устройство, связанное с mfd *)

if unlockpt(mfd) = -1 then

begin

  perror('Невозможно разблокировать ведомое устройство');

  halt(1);

end;

(* Получаем имя ведомого устройства и затем пытаемся открыть его *)

slavenm := ptsname (mfd);

if slavenm = nil then

begin

  perror('Невозможно получить имя ведомого устройства');

  halt(1);

end;

sfd := fdopen (slavenm, Open_RDWR);

if slavefd = -1 then

begin

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

  halt(1);

end;

Теперь, когда получен доступ к драйверу устройства псевдотерминала, нужно установить для него дисциплину линии связи. До сих пор дисциплина линии связи рассматривалась как единое целое, тогда как в действительности она состоит из набора внутренних модулей ядра, известных как модули STREAM.

Стандартная дисциплина линии связи псевдотерминала состоит из трех модулей: ldterm (модуль дисциплины линии связи терминала), ptem (модуль эмуляции псевдотерминала) и ведомой части псевдотерминала. Вместе они работают как настоящий терминал. Эта конфигурация показана на рис. 9.5.



































































































ldterm

















pterm





Дисциплина

линии связи













Ведомый порт

псевдотерминала















Рис. 9.5. Дисциплина линии связи в виде модулей STREAM для устройства псевдотерминала

Для создания дисциплины линии связи нужно «вставить» дополнительные модули STREAM в ведомое устройство. Это достигается при помощи многоцелевой функции ioctl, например:

/*

 * Заголовочный файл stdio содержит интерфейс STREAMS

 * и определяет макрокоманду I_PUSH, используемую в качестве

 * второго аргумента функции ioctl().

*/

uses stdio;

.

.

.

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

(* Вставляем два модуля в ведомое устройство *)

ioctl(sfd, I_PUSH, 'ptem');

ioctl(sfd, I_PUSH, 'ldterm');

Обратимся теперь к главному примеру, программе tscript, которая использует псевдотерминал в пределах одного компьютера для перехвата вывода командного интерпретатора в процессе интерактивного сеанса, не влияя на ход этого сеанса. (Эта программа аналогична команде

UNIX script.) Данный пример можно расширить и для дистанционного входа через сеть.


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