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



         

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


output.

procedure script(mfd:longint);

var

  nread, ofile:longint;

  _set, master:fdset;

  attr:termios;

  buf:array [0..511] of char;

begin

  (* Перевести дисциплину линии связи в режим прямого доступа *)

  tcgetattr (0, attr);

  attr.c_cc[VMIN] := 1;

  attr.c_cc[VTIME] := 0;

  attr.c_lflag := attr.c_lflag and not (ISIG or ECHO or ICANON);

  tcsetattr (0, TCSAFLUSH, attr);

  (* Открыть выходной файл *)

  ofile := fdopen ('output', Open_CREAT or Open_WRONLY or Open_TRUNC, octal(0666));

  (* Задать битовые маски для системного вызова select *)

  FD_ZERO (master);

  FD_SET (0, master);

  FD_SET (mfd, master);

  (* Вызов select осуществляется без таймаута,

   * и будет заблокирован до наступления события. *)

  _set := master;

  while select (mfd + 1, @_set, nil, nil, nil) > 0 do

  begin

    (* Проверить стандартный ввод *)

    if FD_ISSET (0, _set) then

    begin

      nread := fdread (0, buf, 512);

      fdwrite (mfd, buf, nread);

    end;

    (* Проверить главное устройство *)

    if FD_ISSET (mfd, _set) then

    begin

      nread := fdread (mfd, buf, 512);

      write (ofile, buf, nread);

      write (1, buf, nread);

    end;

    _set := master;

  end;

end;

Следующий сеанс демонстрирует работу программы tscript. Комментарии, обозначенные символом #, показывают, какая из оболочек выполняется в данный момент.

$ ./tscript

$ ls -l tscript     # работает новая оболочка

-rwxr-xr-x   1 spate    fcf 6984 Jan 22 21:57 tscript

$ head -2 /etc/passwd # выполняется в новой оболочке

root:х:0:1:0000-Admin(0000):/:/bin/ksh

daemon:x:1:1:0000-Admin(0000):/:

$ exit         # выход из новой оболочки

$ cat output       # работает исходная оболочка

-rwxr-xr-x   1 spate     fcf 6984 Jan 22 21:57 tscript

root:х:0:1:0000-Admin(0000):/:/bin/ksh

daemon:x:1:1:0000-Admin(0000):/:

Упражнение 9.5. Добавьте к программе обработку ошибок и возможность задания в качестве параметра имени выходного файла. Если имя не задано, используйте по умолчанию имя output.

Упражнение 9.6. Эквивалентная стандартная программа UNIX script позволяет задать параметр -а, который указывает на необходимость дополнения файла output (содержимое файла не уничтожается). Реализуйте аналогичную возможность в программе tscript.




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