Книга: Linux программирование в примерах
8.4.3.1. Интерфейс nftw()
8.4.3.1. Интерфейс nftw()
Чтобы избавиться от проблем, System V предложила функцию ftw()
(«file tree walk» — обход дерева файлов), ftw()
осуществляла всю работу по «прохождению» дерева (иерархии) файлов. Вы предоставляете ей указатель на функцию, и она вызывает эту функцию для каждого объекта файла, с которым сталкивается. Ваша функция должна затем обработать каждый объект файловой системы, как считает нужным.
Со временем стало ясно, что интерфейс ftw()
не вполне выполнял свою работу;[84] например, первоначально он не поддерживал символические ссылки. По этим причинам к X/Open Portability Guide, который теперь является частью POSIX, была добавлена nftw()
(«new (новая) ftw()
» [важно]). Вот прототип:
#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
, она должна подсчитывать занимаемое ссылками пространство отдельно от связанных с ними файлов.)
- 8.4.3. Перемещение по иерархии: nftw()
- 12. Лекция: Создание приложений с графическим интерфейсом пользователя.
- 5.21 IP-адреса, интерфейсы и множественное пребывание
- Множественные интерфейсы и имена методов
- 2.1 Интерфейс SCSI
- 2.2 Интерфейсы IDE, EIDE и АТА
- 7.2 Интерфейс WMI
- 7.5 Программные интерфейсы приложений для адаптеров шины
- Не допускайте того, чтобы поток пользовательского интерфейса блокировался на длительное время
- Абстрактные базы как двоичные интерфейсы
- Интерфейсы накопителей на жестких магнитных дисках
- Интерфейс SATA