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



         

Системный вызов fdread - часть 2


/p>

Рис. 9.3. Этапы чтения из терминала в каноническом режиме

Шаг 1 представляет ситуацию в момент выполнения программой вызова read. В этот момент пользователь уже напечатал строку echo, но поскольку строка еще не завершена символом перевода строки, то в буфере чтения нет данных, и выполнение процесса приостановлено.

На шаге 2 пользователь напечатал q, затем передумал и набрал символ erase для удаления символа из строки ввода. Эта часть схемы подчеркивает, что редактирование строки ввода может выполняться, не затрагивая программу, выполняющую вызов read.

На шаге 3 строка ввода завершена, только еще не содержит символ перехода на новую строку. Часть схемы, обозначенная как шаг 4, показывает состояние в момент ввода символа перехода на новую строку, при этом драйвер терминала передает строку ввода, включая символ перевода строки, в буфер чтения. Это приводит к шагу 5, на котором вся строка ввода становится доступной для чтения. В процессе, выполнившем вызов read, происходит возврат из этого вызова, при этом число введенных символов nread равно 11. Шаг 6 показывает ситуацию сразу же после такого завершения вызова, при этом и строка ввода, и буфер чтения снова временно пусты.

Следующий пример подкрепляет эти рассуждения. Он основан на простой программе read_demo, которая имеет лишь одну особенность: она использует небольшой размер буфера для приема байтов из стандартного ввода.

(* Программа read_demo - вызов fdread для терминала *)

uses linux;

const

  SMALLSZ=10;

var

  nread:longint;

  smallbuf:array [0..SMALLSZ] of char;

begin

  nread := fdread (0, smallbuf, SMALLSZ);

  while nread > 0 do

  begin

    smallbuf[nread] := #0;

    writeln('nread: ',nread,' ', smallbuf);

    nread := fdread (0, smallbuf, SMALLSZ);

  end;

end.

Если подать на вход программы следующий терминальный ввод

1

1234

Это более длинная строка

<EOF>

то получится такой диалог:

1

nread: 2 1

1234

nread: 5 1234

Это более длинная строка

nread: 10 Это более

nread: 10 длинная с

nread: 6 трока

Обратите внимание, что для чтения самой длинной строки требуется несколько последовательных операций чтения. Заметим также, что значения счетчика nread включают также символ перехода на новую строку. Это не показано для простоты изложения.

Что происходит, если терминал не находится в каноническом режиме? В таком случае для полного управления процессом ввода программа должна устанавливать дополнительные параметры состояния терминала. Это осуществляется при помощи семейства системных вызовов, которые будут описаны позже.

Упражнение 9.1. Попробуйте запустить программу read_demo, перенаправив ее ввод на чтение файла.




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