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


         

Пример управления терминалом: программа tscript - часть 3


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

  slavenm := ptsname (masterfd);

  if slavenm = nil then

  begin

    fdclose (masterfd);

    pttyopen:=-4;

    exit;

  end;

  slavefd := fdopen (slavenm, Open_RDWR);

  if slavefd = -1 then

  begin

    fdclose (masterfd);

    pttyopen:=-5;

    exit;

  end;

  (* Создать дисциплину линии связи *)

  ioctl (slavefd, I_PUSH, pchar('ptem'));

  if linuxerror>0 then

  begin

    fdclose (masterfd);

    fdclose (slavefd);

    pttyopen:=-6;

    exit;

  end;

  ioctl (slavefd, I_PUSH, pchar('ldterm'));

  if linuxerror>0 then

  begin

    fdclose (masterfd);

    fdclose (slavefd);

    pttyopen:=-7;

    exit;

  end;

  pttyopen:=1;

end;

Третья процедура – процедура runshell. Она выполняет следующие задачи:

–        вызывает setpgrp, чтобы оболочка выполнялась в своей группе процессов. Это позволяет оболочке полностью управлять обработкой сигналов, в особенности в отношении управления заданиями;

–        вызывает системный вызов dup2 для перенаправления дескрипторов stdin, stdout и stderr на дескриптор файла ведомого устройства. Это особенно важный шаг;

–        запускает оболочку при помощи вызова ехес, которая выполняется до тех пор, пока не будет прервана пользователем.

procedure runshell (sfd:longint);

begin

  setpgrp;

  dup2 (sfd, 0);

  dup2 (sfd, 1);

  dup2 (sfd, 2);

  execl ('/bin/sh -i');

end;

Теперь рассмотрим саму процедуру script. Первым действием процедуры script является изменение дисциплины линии связи так, чтобы она работала в режиме прямого доступа. Это достигается получением текущих атрибутов терминала и изменением их при помощи вызова tcsetattr. Затем процедура script открывает файл output и использует системный вызов select (обсуждавшийся в главе 7) для обеспечения одновременного ввода со своего стандартного ввода и ведущего устройства псевдотерминала. Если данные поступают со стандартного ввода, то процедура script передает их без изменений ведущему устройству псевдотерминала. При поступлении же данных с ведущего устройства псевдотерминала процедура script записывает эти данные в терминал пользователя и в файл




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