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

Имена устройств UNIX


Подключенные к системе UNIX периферийные устройства (диски, терминале) принтеры, дисковые массивы и так далее) доступны при помощи их имен в файловой системе. Эти файлы называются файлами устройств (device files). Соответствующие файловым системам разделы дисков также относятся к классу объектов, представленных этими специальными файлами.

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

Обычно эти специальные файлы находятся в каталоге /dev. Поэтому, например, имена

/dev/tty00

/dev/console

/dev/pts/as   (псевдотерминал для сетевого доступа)

могут соответствовать трем портам терминалов системы, а имена

/dev/lp

/dev/rmt0

/dev/rmt/0cbn

могут обозначать матричный принтер и два накопителя на магнитной ленте. Имена разделов диска могут иметь разнообразный формат, например:

/dev/dsk/c0b0t0d0s3

/dev/dsk/hd0d



В командах оболочки и в программах файлы устройств могут использоваться так же, как и обычные файлы, например, команды

$ cat fred > /dev/lp

$ cat fred > /dev/rmt0

выведут файл fred на принтер и накопитель на магнитной ленте соответственно (если это позволяют права доступа). Очевидно, что пытаться таким образом оперировать разделами диска с файловыми системами – огромный риск. Одна неосторожная команда может привести к случайной потере большого объема ценных данных. Кроме того, если бы права доступа к таким файлам устройств были бы не очень строгими, то продвинутые пользователи могли бы обойти ограничения прав доступа, наложенные на файлы в файловой системе. Поэтому системные администраторы должны задавать для файлов дисковых разделов соответствующие права доступа, чтобы иметь уверенность в том, что такие действия невозможны.

Для доступа к файлам устройств в программе могут использоваться вызовы fdopen, fdclose, fdread и fdwrite, например, программа

uses linux;

var

  i,fd:integer;

begin

  fd := fdopen ('/dev/tty', Open_WRONLY);

  for i := 1 to 100 do

    fdwrite(fd, 'x', 1);

  fdclose(fd);

end.

приведет к выводу 100 символов х на порт терминала tty00. Конечно, работа с терминалом является отдельной важной темой, поэтому она подробнее будет рассмотрена в главе 9.



Содержание раздела