Средства, обслуживающие понятие файла
В трактовке стандарта 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() выполняют управляющие операции с буферами потоков.