Программирование в стандарте POSIX

       

Средства, обслуживающие понятие файла


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

В стандарте зафиксированы следующие типы файлов:

  • обычный файл;
  • каталог;

  • канал;

  • символьный специальный файл;
  • блочный специальный файл;
  • символьная ссылка;

  • сокет.

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

В пределах файловой системы каждый файл имеет уникальный идентификатор (порядковый номер - он же номер описателя файла).

Согласно стандарту, с каждым файлом ассоциирована по крайней мере следующая служебная информация:

  • режим - объект, содержащий биты режима и тип файла;
  • числовой идентификатор владельца-пользователя;
  • числовой идентификатор владеющей группы.

По отношению к конкретному файлу все пользователи делятся на три категории:

  • владелец файла;

  • члены владеющей группы;
  • прочие пользователи.

Для каждой из этих категорий режим доступа определяет права на операции с файлом, а именно:

  • право на чтение;

  • право на запись;

  • право на выполнение (для каталогов - право на поиск).

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

Для получения информации о файлах и файловых системах, а также для смены их атрибутов предназначены следующие служебные программы и функции:

  • утилита pwd и функция getcwd() позволяют опросить абсолютное маршрутное имя текущего каталога;
  • утилита ls и функции семейства stat() (stat(), fstat(), lstat()) выдают информацию о файлах;
  • утилита df и функции fstatvfs() и statvfs() обеспечивают получение интегральной информации о файловых системах;
  • служебная программа du выдает информацию о суммарном объеме пространства, занятого иерархиями файлов;

  • утилита cd и функция chdir() позволяют изменить текущий каталог;
  • утилиты chown и chmod, функции chown(), fchown(), chmod(), fchmod() служат для изменения таких атрибутов файлов, как владелец и режим доступа;
  • утилита touch модифицирует время последнего доступа и/или изменения файла.


Создание обычных файлов обслуживается функцией creat(), создание каталогов - утилитой mkdir и одноименной функцией, создание каналов - утилитой mkfifo и одноименной функцией.

Новые ссылки на файл (жесткие или символьные) создают служебная программа ln, а также функции link() и symlink().

Для удаления файлов служат утилиты rm и rmdir, функции unlink(), rmdir() и remove().

Копирование файлов выполняется служебной программой cp, перемещение - программой mv или функцией rename().

Обход файловой иерархии и систематическую обработку ее элементов осуществляет утилита find.

Одной из форм обхода и обработки файловой иерархии можно считать архивирование. Стандарт POSIX предусматривает для этого служебную программу pax.

В стандарте POSIX-2001 выделены две основные группы функций, обслуживающие операции ввода/вывода:



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


Для открытия файлов и формирования новых описаний открытых файлов, файловых дескрипторов и потоков служат функции нижнего уровня open() и pipe(), а также функции буферизованного ввода/вывода fopen(), fdopen(), freopen().

Для закрытия файлов предназначены функции close() и fclose().

Весьма полезной с практической точки зрения является функция создания и открытия временных файлов tmpfile().

Чтение данных из файла выполняют функции read() и fread(), запись - функции write() и fwrite().

Содержимое символьных ссылок приходится читать особым образом, посредством функции readlink().

Для буферизованного ввода/вывода байт предназначены функции fgetc() и fputc(), строки рекомендуется вводить, вызывая функцию fgets(), а выводить с помощью функций fputs() и puts().

Индикатор текущей позиции файла может быть опрошен или передвинут посредством функции нижнего уровня lseek(), а также функций буферизованного ввода/вывода fseek(), ftell(), ftello(), fgetpos(), fsetpos(), rewind().

Для выполнения разнообразных управляющих операций над открытым файлом ом предназначена функция fcntl().

Особый класс управляющих операций с файлами со своей системой понятий составляют блокировки, хотя они также оформляются как команды функции fcntl().

Функции setbuf(), setvbuf() и fflush() выполняют управляющие операции с буферами потоков.


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