Опубликован: 15.06.2004 | Доступ: свободный | Студентов: 2290 / 579 | Оценка: 4.35 / 3.96 | Длительность: 27:47:00
ISBN: 978-5-9556-0011-6
Лекция 4:

Организация файловой системы

Получение информации о файлах и файловых системах

Чтобы узнать абсолютное маршрутное имя   текущего каталога, приложение может воспользоваться упоминавшейся ранее обычной встроенной командой языка shell

pwd  [-L | -P]

#include <unistd.h>
char *getcwd (char *buf, size_t size);
Листинг 4.1. Описание функции getcwd().

Команда pwd с (подразумеваемой) опцией -L извлекает имя текущего каталога из переменной окружения PWD, если это возможно. Посредством опции -P выполняется раскрытие символьных ссылок: в выдаваемом на стандартный вывод абсолютном маршрутном имени вместо символьных ссылок подставляется их содержимое.

Функция getcwd() помещает абсолютное маршрутное имя   текущего каталога (без символьных ссылок) в массив buf длины size, который и возвращается в качестве результата (при ошибке результат равен NULL).

Приведем пример программы, использующей функцию getcwd() (см. листинг 4.2).

#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
int main (void) {
 size_t size;
 char *buf;
 char *apath;
 /* Выясним, каким должен быть размер буфера            */
 /* для абсолютного маршрутного имени текущего каталога */
 size = (size_t) pathconf (".", _PC_PATH_MAX);
 if ((buf = (char *) malloc (size)) == NULL) {
   fprintf (stderr, "\nНе удалось выделить буфер размера %d\n", size);
   return 1;
 }
  if ((apath = getcwd (buf, size)) == NULL) {
   fprintf (stderr, "\nНе удалось определить абсолютное маршрутное имя текущего каталога\n");
   return 1;
 }
 printf ("\nАбсолютное маршрутное имя текущего каталога: %s\n", apath);
 return 0;
}
Листинг 4.2. Пример использования функции getcwd().

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

Для выдачи на стандартный вывод информации о файлах всех типов служит утилита

ls  [опция ...] [файл ...]

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

Опции управляют порядком и степенью подробности выдаваемой информации о файлах. Если опции не заданы, выводятся только имена файлов. Если не заданы файлы, выдается информация о файлах   текущего каталога. Опция -l предписывает выводить подробную информацию. Например, при использовании служебной программы ls по команде

ls -l /

может быть выдано следующее (см. листинг 4.3):

total 338
drwxrwxr-x    2 root     root         4096 Jul  6 13:31 a
drwxr-xr-x    2 root     root         4096 Jul  8 13:32 bin
drwxr-xr-x    4 root     root         1024 Jul  6 15:06 boot
drwxrwxr-x    2 root     root         4096 Jul  6 13:31 cdrom
drwxr-xr-x   18 root     root        86016 Sep  2 10:42 dev
drwxr-xr-x    6 root     root         4096 Feb 23  2003 dss
drwxr-xr-x   60 root     root         4096 Sep  2 10:42 etc
drwxr-xr-x   20 root     root         4096 Jul 15 18:00 home
drwxr-xr-x    2 root     root         4096 Jun 12  2001 initrd
drwxr-xr-x    8 root     root         4096 Aug  8 13:16 lib
drwx------    2 root     root        16384 Jul  6 14:15 lost+found
drwxr-xr-x    2 root     root         4096 Apr  1  2002 misc
drwxr-xr-x    5 root     root         4096 Jul  6 11:24 mnt
drwxr-xr-x    7 root     root         4096 Jul 23 13:09 opt
dr-xr-xr-x   84 root     root            0 Sep  2  2003 proc
drwxr-x---    5 root     root         4096 Sep  1 17:10 root
drwxr-xr-x    2 root     root         4096 Jul 11 17:38 sbin
drwxrwxrwt   23 root     root         8192 Sep  2 12:43 tmp
drwxr-xr-x   14 root     root         4096 Jul 15 12:50 usr
drwxr-xr-x   16 root     root         4096 Jul  9 16:22 var
4.3. Возможный результат использования служебной программы ls

Число в первой строке есть суммарный размер (в блоках по 512 байт) всех файлов   каталога, информация о которых выдана. Далее следуют строки с информацией об отдельных файлах. Первый символ в этих строках задает тип файла:

  • d - каталог ;
  • b - блочный специальный файл ;
  • c - символьный специальный файл ;
  • l - символьная ссылка ;
  • p - канал ;
  • - (минус) - обычный файл.

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

Девять последующих символов отражают режим доступа к файлу: первые три символа - права доступа его владельца, следующие три - владеющей группы, последние три - права доступа прочих пользователей. Наличие буквы r ( чтение ), w ( запись ) или x (выполнение) означает, что соответствующее право имеется; знак минус свидетельствует об отсутствии права. Например, файл   /usr является каталогом, куда может писать только пользователь root, а читать и искать информацию - все остальные.

Следом идет число ссылок на файл (считаются только так называемые жесткие ссылки, т. е. количество вхождений имени файла в каталоги ). Для каталога оно заведомо не меньше двух (обоснование этого факта предоставляется читателю).

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

Наконец, следуют дата и время последнего изменения и имя файла. По умолчанию имена файлов сортируются в алфавитном порядке.

Опишем еще несколько употребительных опций служебной программы ls.

Ключ Описание
-a Вывести список всех файлов (обычно не выводятся данные о файлах, имена которых начинаются с точки).
-C Выдавать имена файлов в несколько столбцов (с сортировкой по столбцам). Отметим, что если в командной строке встречаются пары взаимоисключающих опций (например, -lC), то действует та, что указана последней.
-d Трактовать каталоги наравне с файлами других типов. Часто используется с опцией -l для получения сведений о состоянии каталога.
-F Выводить символ / после имен каталогов, * - после выполнимых файлов, | - после каналов, @ - после символьных ссылок.
-i Выдавать порядковый номер файла в файловой системе (см. выше).
-R Рекурсивно обойти встретившиеся подкаталоги.
-r Изменить порядок сортировки файлов на обратный.
-t Использовать в качестве первичного ключа сортировки время последнего изменения (сначала идут самые свежие файлы ); имя служит вторичным ключом. Обычно символьные ссылки трактуются утилитой ls наравне с файлами других типов, только на месте имени выводится комбинацияимя_файла-ссылки -> содержимое_файла-ссылки. Для получения информации о файле, на который указывает символьная ссылка, следует воспользоваться одной из следующих опций.
-L Если символьная ссылка является аргументом утилиты ls или встретилась в процессе обхода файловой иерархии, выдавать информацию об указуемом файле, а не о ссылке. На месте имени выводится имя файла -ссылки (а не указуемого файла ).
-H Аналогична -L, но воздействует только на символьные ссылки, заданные в командной строке и указывающие на каталог.
Антон Коновалов
Антон Коновалов

В настоящее время актуальный стандарт - это POSIX 2008 и его дополнение POSIX 1003.13
Планируется ли актуализация материалов данного очень полезного курса?

Павел Храмцов
Павел Храмцов
Россия
Денис Комаров
Денис Комаров
Россия, Москва