Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
методичка ПО ОСРВ заочники.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
8.72 Mб
Скачать

3.4.1. Что же такое каталог, в конце концов?

Ответ. Каталог представляет собой особый вид файла, в котором содержится список имен файлов и подкаталогов. Каталог по ряду признаков подобен файлу utmp (см. главу 2). В нем содержится последовательность записей, а каждая запись четко определена по на­значению и имеет полностью документированную структуру. Каждая запись в каталоге служит для представления одной сущности - одного файла или одного каталога. В от­личие от обычных файлов каталог никогда не бывает пустым. В каждом каталоге есть две специальные записи, которые обозначаются так:. {точка) и .. (точка_точка); точка-это имя текущего каталога, а точка_точка - это имя вышележащего каталога.

3.4.2. Работают ли системные вызовы open, read и close в отношении каталогов?

Ответ 1. В Olden Days ®#Что это такое? нет упоминаний о таких возможностях. Порабо­тайте с такими командами на вашей системе:

$cat/

as'.a'asa..a'bw.tagsb'c{

quota. userc'{

quota.group'esbetce"sbtmp"'sbdev" sbmnt' wcsbin '2

sbopt2

'8

sbusr8

'9

sbvar9

(many lines of hard-to-read data omitted)

$ more /tmp

/tmp is a directory

$ od -c /dev

Из этих примеров следует ряд интересных результатов. Во-первых, команды cat и od могут I читать каталоги так же, как они читают обыкновенные файлы. В этих командах исполь-I зуются стандартные системные вызовы для работы с файлами: open, read и close. Поэтому I каталоги можно читать как обыкновенные файлы.'

Во-вторых, команда more отказывается показывать вам содержимое каталога. Она распо­знает, что в качестве аргумента задан каталог, и не будет отображать его содержимое. Команда more смогла бы отображать содержимое каталога, но не думаю, что вам захотелось бы его рассматривать. Некоторые версии команды cat, подобно команде more, распознают каталог при обращении и не отображают его содержимое.

Наконец, примеры показывают, что каталоги не содержат однородного текста. Каталог со­стоит из последовательности структур.

Ответ 2. Использование системных вызовов open, read и close для получения списка | содержимого каталогов является плохой идеей. В Unix поддерживается много типов ката-I логов. Допускается читать диски, используя форматы Apple HFS, ISO9660, VFAT. Можно I читать каталоги NFS и различные обыкновенные каталоги. При использовании системно­го вызова read потребуется знание формата записей для обработки каждого типа каталога.

3.4.3. Хорошо, хорошо. Но как же мне прочитать каталог?

Обратимся к электронному справочнику. Поищем информацию по ключевому слову direct:

$ man -k direct

В одной из систем по этому слову была найдена 81 запись. Отфильтруем этот вывод по слову read:

$ man -к direct | grep read

DXmHelpSystemDisplay (3X) - Displays a topic or directory of the

help file in Bookreader.

opendir, readdir, readdirj, telldir, seekdir, rewinddir, closedir (3) -

Performs operations on directories

$

Первый экран документации будет выглядеть так:

$ man 3 readdir

opendir(3) opendir(3)

NAME

opendir, readdir, readdirj, telldir, seekdir, rewinddir, closedir -Performs

operations on directories

LIBRARY

Standard С Library (libc.a)

SYNOPSIS

#include <sys/types.h>

#inc/ude <dirent.h>

DIR "opendir (

const char *dir name);

struct dirent "readdir (

DIR "dir_pointer);

int readdir_r (

DIR *dir_pointer,

struct dirent 'entry,

struct dirent **result);

long telldir (

DIR "dirjjointer);

void seekdir (

DIR *dir pointer;

long location);

void rewinddir (

DIR *dirjjointer);

int closedir (

DIR 'dirjjointer);

[more] (11%)

Согласно этой странице документации мы убеждаемся в том, что данные из каталога по­лучают аналогично тому, как получают данные из файла. Сначала с помощью opendir открывается соединение с каталогом, а далее readdir возвращает указатель на следующий элемент в каталоге. Наконец, closedir разрывает соединение. Системные вызовы: seekdir, telldir и rewinddir по назначению подобны Iseek. На рисунке 3.2 показано, как происходит чтение.

Рисунок 3.2

Чтение записей из каталога

Чтение содержимого каталога

Каталог- это список файлов, а более точно, это последовательность записей, каждая из которых есть запись о каталоге. Мы читаем записи с помощью вызова readdir. После рабо­ты каждого вызова readdir возвращается указатель на очередную запись типа struct direntn. Компоненты структуры описаны в соответствующей документации и в заголовочном фай­ле /usr/include/dirent/h. Например, начало документации по dirent, которая была взята в сис­теме Sun OS, будет таким:

file Formats dirent(4)

NAME

dirent - file system independent directory entry SYNOPSIS

#include <dirent.h>

DESCRIPTION

Different file system types may have different directory

entries. The dirent structure defines a file system

independent directory entry, which contains information com-mon

to directory entries in different file system types. A

set of these structures is returned by the getdents(2) sys-tem

call.

The dirent structure is defined:

struct dirent {

ino_t d_ino;

off_td_off;

unsigned short djeclen;

chard name[ 1];

};

Каждая структура dirent содержит элемент с именем d_name. Это элемент для хранения имени файла. Заметьте, что длина массива d_name в этой системе равна 1. Что означают такие установки? Один символ char задает пространство для сохранения в поле одиночного терминального нулевого символа.