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

на главную - закладки

Жанры

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

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

Шрифт:

В дополнение к

getcwd
GLIBC имеет несколько других непереносимых процедур. Они избавляют вас от хлопот по управлению буферами и обеспечивают совместимость со старыми системами BSD. Подробности см в getcwd(3).

8.4.3. Перемещение по иерархии:

nftw

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

du
, которая выводит сведения об использовании диска, '
chown -R
', которая рекурсивно изменяет владельцев, или программу
find
, которая находит файлы, подходящие по определенным критериям.

На данный момент

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

8.4.3.1. Интерфейс

nftw

Чтобы избавиться от проблем, System V предложила функцию

ftw
(«file tree walk» — обход дерева файлов),
ftw
осуществляла всю работу по «прохождению» дерева (иерархии) файлов. Вы предоставляете ей указатель на функцию, и она вызывает эту функцию для каждого объекта файла, с которым сталкивается. Ваша функция должна затем обработать каждый объект файловой системы, как считает нужным.

Со временем стало ясно, что интерфейс

ftw
не вполне выполнял свою работу; [84] например, первоначально он не поддерживал символические ссылки. По этим причинам к X/Open Portability Guide, который теперь является частью POSIX, была добавлена
nftw
(«new (новая)
ftw
» [важно]). Вот прототип:

84

POSIX стандартизировал

ftw
для поддержки существующего кода, а GNU/Linux b коммерческие системы Unix продолжают её поддерживать. Однако, поскольку она недостаточно функциональна, мы не будем больше ее обсуждать. Если интересуетесь, см. ftw(3). — Примеч. автора.

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

int nftw(const char *dir, /* Отправная точка */

 int (*fn)(const char *file, /* Указатель функции на */

const struct stat *sb, /* функцию из четырех аргументов */

int flag, struct FTW *s),

 int depth, int flags); /* Максимум открытых fds, флаги */

А вот аргументы:

const char *dir

Строка с именем отправной точки иерархии для обработки.

int (*fn)(const char *file, const struct stat *sb, int flag, struct FTW *s)

Указатель на функцию с данными аргументами. Эта функция вызывается для каждого объекта в иерархии. Подробности ниже.

int depth

Этот аргумент назван неверно. Чтобы избежать выхода за пределы дескрипторов файлов,

nftw
держит открытыми не более, чем
depth
одновременно открытых каталогов. Это не препятствует обработке
nftw
иерархий, которые глубже уровня
depth
, но меньшие значения
depth
означают, что
nftw
придется делать больше работы.

flags

Набор флагов, объединяемых побитовым ИЛИ, которые указывают, как

nftw
должна обрабатывать иерархию.

Интерфейс

nftw
имеет два отдельных набора флагов. Одни набор контролирует саму
nftw
(аргумент
flags
функции
nftw
). Другой набор передается предоставленной пользователем функции, которую вызывает
nftw
(аргумент
flags
для
(*fn)
). Однако,
интерфейс запутывает, поскольку имена обоих наборов флагов начинаются с префикса '
FTW_
'. Мы постараемся сделать все, чтобы это прояснить по ходу дела. В табл. 8.3 представлены флаги, которые контролируют
nftw
.

Таблица 8.3. Управляющие флаги для

nftw

Флаг Значение
FTW_CHDIR
При установке перед открытием каждого из каталогов сначала осуществляется переход в него. Это действие более эффективно, но вызывающее приложение должно быть готово оказаться в другом каталоге, когда
nftw
завершится
FTW_DEPTH
При установке осуществляется «сначала глубокий поиск». Это означает, что все файлы и подкаталоги обрабатываются до того, как будет обработан сам каталог
FTW_MOUNT
При установке остается в той же самой смонтированной файловой системе. Это более специализированная опция
FTW_PHYS
При установке не следует по символическим ссылкам

FTW_CHDIR
предоставляет большую эффективность; при обработке глубоких иерархий файлов ядру не приходится обрабатывать снова и снова полные пути имен при осуществлении
stat
или открытии каталога. Экономия времени для больших иерархий может быть вполне ощутимой. [85]

FTW_DEPTH
может быть, а может и не быть тем, что вам нужно; для некоторых приложений это безусловно справедливо. Рассмотрите '
chmod -R u-rx .
'. Эта команда удаляет права чтения и исполнения для владельца для всех файлов и подкаталогов в текущем каталоге. Если это изменение прав доступа применено к каталогу до того, как оно применено к содержимому каталога, любые последующие попытки обработки содержимого потерпят неудачу! Поэтому команда должна применяться к каталогу после обработки его содержимого. [86] Справочная страница GNU/Linux nftw(3) отмечает для
FTW_PHYS
, что «это то, что вам нужно». Это позволяет вам обрабатывать сами символические ссылки, что обычно бывает нужно (Рассмотрите
du
, она должна подсчитывать занимаемое ссылками пространство отдельно от связанных с ними файлов.)

85

У некоторых старых версий GLIBC были проблемы с FTW_CHDIR. Это не относится к GLIBC 2.3.2 и более поздним, и маловероятно, что вы столкнетесь с проблемами — Примеч. автора.

86

Мы не знаем, почему кому-нибудь может понадобиться делать такое изменение, но философия «что вы просили, то и получили» применяется и здесь! — Примеч. автора.

8.4.3.2. Функция обратного вызова

nftw

После запуска

nftw
она вызывает функцию, указатель для которой предоставляете вы. (Такие функции называются функциями обратного вызова (callback functions), поскольку они «вызываются обратно» из библиотечного кода.) Функция обратного вызова получает четыре аргумента:

const char *file

Имя текущего обрабатываемого файла (каталога, символической ссылки и т.д.).

const struct stat *sb

Указатель на

struct stat
для файла.

int flag

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

struct FTW *s

Эта структура предоставляет две отдельные части информации:

struct FTW {

 int base; /* Индекс в файле базовой части имени файла */

 int level; /* Глубина этого элемента относительно точки отсчета */

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

Барон играет по своим правилам

Ренгач Евгений
5. Закон сильного
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Барон играет по своим правилам

Сердце Дракона. нейросеть в мире боевых искусств (главы 1-650)

Клеванский Кирилл Сергеевич
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
7.51
рейтинг книги
Сердце Дракона. нейросеть в мире боевых искусств (главы 1-650)

Герцогиня в ссылке

Нова Юлия
2. Магия стихий
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Герцогиня в ссылке

Ну привет, заучка...

Зайцева Мария
Любовные романы:
эро литература
короткие любовные романы
8.30
рейтинг книги
Ну привет, заучка...

На Ларэде

Кронос Александр
3. Лэрн
Фантастика:
фэнтези
героическая фантастика
стимпанк
5.00
рейтинг книги
На Ларэде

Сердце Дракона. Том 12

Клеванский Кирилл Сергеевич
12. Сердце дракона
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
7.29
рейтинг книги
Сердце Дракона. Том 12

Истинная поневоле, или Сирота в Академии Драконов

Найт Алекс
3. Академия Драконов, или Девушки с секретом
Любовные романы:
любовно-фантастические романы
6.37
рейтинг книги
Истинная поневоле, или Сирота в Академии Драконов

Кодекс Охотника. Книга VI

Винокуров Юрий
6. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга VI

Гардемарин Ее Величества. Инкарнация

Уленгов Юрий
1. Гардемарин ее величества
Фантастика:
городское фэнтези
попаданцы
альтернативная история
аниме
фантастика: прочее
5.00
рейтинг книги
Гардемарин Ее Величества. Инкарнация

Сама себе хозяйка

Красовская Марианна
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Сама себе хозяйка

Душелов. Том 3

Faded Emory
3. Внутренние демоны
Фантастика:
альтернативная история
аниме
фэнтези
ранобэ
хентай
5.00
рейтинг книги
Душелов. Том 3

Газлайтер. Том 10

Володин Григорий
10. История Телепата
Фантастика:
боевая фантастика
5.00
рейтинг книги
Газлайтер. Том 10

Стеллар. Заклинатель

Прокофьев Роман Юрьевич
3. Стеллар
Фантастика:
боевая фантастика
8.40
рейтинг книги
Стеллар. Заклинатель

Возвышение Меркурия. Книга 5

Кронос Александр
5. Меркурий
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 5