Чтение онлайн

на главную

Жанры

Linux программирование в примерах

Роббинс Арнольд

Шрифт:

Во-вторых, стандарт POSIX ничего не говорит о возможных значениях

d_info
. Он говорит, что возвращенные структуры представляют элементы каталогов для файлов; это предполагает, что
readdir
не возвращает пустые элементы, поэтому реализация GNU/Linux
readdir
не беспокоится с возвратом элементов, когда '
d_ino == 0
'; она переходит к следующему действительному элементу.

Поэтому по крайней мере на системах GNU/Linux и Unix маловероятно, что

d_ino
когда-нибудь будет равен нулю. Однако, лучше по возможности вообще избегать использования этого поля.

Наконец, некоторые системы используют

d_fileno
вместо
d_ino
в
struct dirent
. Знайте об этом, когда нужно перенести на такие системы код, читающий каталоги.

Косвенные системные вызовы

«Не

пробуйте это дома, дети!»

– М-р Wizard -

Многие системные вызовы, такие, как

open
,
read
и
write
, предназначены для вызова непосредственно из кода пользователя: другими словами, из кода, который пишете вы как разработчик GNU/Linux.

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

getdents
; он читает несколько элементов каталога в буфер, предоставленный вызывающим — в данном случае, кодом реализации
readdir
. Затем код
readdir
возвращает действительные элементы каталога, по одному за раз, пополняя при необходимости буфер.

Эти системные вызовы только-для-библиотечного-использования можно отличить от вызовов для-использования-пользователем по их представлению в странице справки. Например, из getdents(2).

ИМЯ

getdents - получить элементы каталога

ОПИСАНИЕ

#include <unistd.h>

#include <linux/types.h>

#include <linux/dirent.h>

#include <linux/unistd.h>

_syscall3(int, getdents, uint, fd, struct dirent*,

dirp, uint, count);

int getdents(unsigned int fd, struct dirent *dirp,

unsigned int count);

Любой системный вызов, использующий макрос

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

В случае

getdents
на многих других системах Unix есть сходный системный вызов; иногда с тем же именем, иногда с другим. Поэтому попытка использования этих вызовов привела бы в любом случае лишь к большому беспорядку с переносимостью; гораздо лучше во всех случаях использовать
readdir
, интерфейс которого хорошо определен, стандартизован и переносим.

5.3.1.2. Элементы каталогов Linux и BSD

Хотя мы только что сказали, что вам следует использовать лишь члены

d_ino
и
d_name
структуры
struct dirent
, стоит знать о члене
d_type
в
struct dirent
BSD и Linux. Это значение
unsigned char
, в котором хранится тип файла, имя которого находится в элементе каталога:

struct dirent {

 ...

 ino_t d_ino; /* Как ранее */

 char d_name[...]; /* Как ранее */

 unsigned char d_type; /* Linux и современная BSD */

 ...

};

d_type
может принимать любые значения, описанные в табл. 5.1.

Таблица 5.1. Значения для

d_type

Имя Значение
DT_BLK
Файл блочного устройства
DT_CHR
Файл символьного устройства
DT_DIR
Каталог
DT_FIFO
FIFO или именованный канал
DT_LNK
Символическая ссылка
DT_REG
Обычный файл
DT_SOCK
Сокет
DT_UNKNOWN
Неизвестный тип файла
DT_WHT
Нет
элемента (только системы BSD)

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

stat
. (Вызов
stat
вскоре будет описан в разделе 5.4.2 «Получение информации о файле».)

5.3.2. Функции размещения каталогов BSD

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

#include <dirent.h> /* XSI */

/* Предупреждение: POSIX XSI использует для обеих функций long, а не off_t */

off_t telldir(DIR *dir); /* Вернуть текущее положение */

void seekdir(DIR *dir, off_t offset); /* Переместиться в данное положение */

Эти процедуры подобны функциям

ftell
и
fseek
и
<stdio.h>
. Они возвращают текущее положение в каталоге и устанавливают текущее положение в ранее полученное значение соответственно.

Эти процедуры включены в часть XSI стандарта POSIX, поскольку они имеют смысл лишь для каталогов, которые реализованы с линейным хранением элементов каталога

Помимо предположений, сделанных относительно лежащей в основе структуры каталога, эти процедуры рискованнее использовать, чем простые процедуры чтения каталога. Это связано с тем, что содержание каталога может изменяться динамически: когда файлы добавляются или удаляются из каталога, операционная система приводит в порядок содержание каталога. Поскольку элементы каталога имеют различный размер, может оказаться, что сохраненное ранее абсолютное смещение больше не представляет начало элемента каталога! Поэтому мы не рекомендуем вам использовать эти функции, если вам они действительно не нужны [56] .

56

Стоит внимательно подумать прежде чем использовать эти функции — Примеч. науч. ред.

5.4. Получение информации о файлах

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

5.4.1. Типы файлов Linux

Linux (и Unix) поддерживает следующие различные типы файлов:

Обычные файлы

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

ls -l
' они обозначаются в виде первого символа '
' поля прав доступа (режима).

Каталоги

Специальные файлы для связывания имен файлов с индексами. В листинге '

ls -l
' они обозначаются первым символом
d
поля прав доступа.

Символические ссылки

Как описано ранее в главе. В листинге '

ls -l
' обозначаются первым символом
l
(буква «эль», не цифра 1) поля прав доступа.

Устройства

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

Блочные устройства

Устройства, ввод/вывод которых осуществляется порциями некоторого фиксированного размера физической записи, такие, как дисковые и ленточные приводы. Доступ к таким устройствам осуществляется через буферный кэш ядра. В листинге '

ls -l
' они обозначаются первым символом
b
поля прав доступа.

Символьные устройства

Известны также как непосредственные (raw) устройства. Первоначально символьными устройствами были те, в которых ввод/вывод осуществлялся по несколько байтов за раз, как в терминалах. Однако, символьное устройство используется также для непосредственного ввода/вывода на блочные устройства, такие, как ленты и диски, минуя буферный кэш [57] . В листинге '

ls -l
' они отображаются первым символом
с
поля прав доступа.

57

Linux использует блочные устройства исключительно для дисков. Другие системы используют оба типа — Примеч. автора.

Поделиться:
Популярные книги

Деревенщина в Пекине 2

Афанасьев Семён
2. Пекин
Фантастика:
попаданцы
дорама
фантастика: прочее
5.00
рейтинг книги
Деревенщина в Пекине 2

Как я строил магическую империю 10

Зубов Константин
10. Как я строил магическую империю
Фантастика:
попаданцы
аниме
фантастика: прочее
5.00
рейтинг книги
Как я строил магическую империю 10

Бояръ-Аниме. Романов. Том 3

Кощеев Владимир
2. Романов
Фантастика:
фэнтези
альтернативная история
6.57
рейтинг книги
Бояръ-Аниме. Романов. Том 3

Император Пограничья 1

Астахов Евгений Евгеньевич
1. Император Пограничья
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Император Пограничья 1

Сильнейший Столп Империи. Книга 1

Ермоленков Алексей
1. Сильнейший Столп Империи
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Сильнейший Столп Империи. Книга 1

Мечник Вернувшийся 1000 лет спустя. Том 2

Ткачев Андрей Юрьевич
2. Вернувшийся мечник
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Мечник Вернувшийся 1000 лет спустя. Том 2

Двойник Короля 10

Скабер Артемий
10. Двойник Короля
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Двойник Короля 10

Пустоши

Сай Ярослав
1. Медорфенов
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Пустоши

Московское золото или нежная попа комсомолки. Часть Вторая

Хренов Алексей
2. Летчик Леха
Фантастика:
попаданцы
5.00
рейтинг книги
Московское золото или нежная попа комсомолки. Часть Вторая

Кадет Морозов

Шелег Дмитрий Витальевич
4. Живой лёд
Фантастика:
боевая фантастика
5.72
рейтинг книги
Кадет Морозов

Поступь Империи

Ланцов Михаил Алексеевич
7. Сын Петра
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Поступь Империи

Император Пограничья 8

Астахов Евгений Евгеньевич
8. Император Пограничья
Фантастика:
городское фэнтези
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Император Пограничья 8

Архонт

Прокофьев Роман Юрьевич
5. Стеллар
Фантастика:
боевая фантастика
рпг
7.80
рейтинг книги
Архонт

Купеческая дочь замуж не желает

Шах Ольга
Фантастика:
фэнтези
6.89
рейтинг книги
Купеческая дочь замуж не желает