int ftw(const char *dir, int (*fn)(const char *file, const struct stat *sb, int flag), int nopenfd);
int nftw(const char *dir, int (*fn)(const char *file, const struct stat *sb, int flag, struct FTW *s), int nopenfd, int flags);
Если элемент - символьная ссылка и в нем происходит ошибка, то XPG4v2 утверждает, что данный элемент не определен (вне зависимости от того, используется ли FTW_NS и FTW_SL или нет).
ftw() рекурсивно вызывает саму себя для перемещения по обнаруженным каталогам, обрабатывая каждый каталог перед обработкой вложенных в него файлов и подкаталогов.
Для того, чтобы избежать использования всех описателей файлов, nopenfd определяет максимальное количество одновременно открытых каталогов. Когда это количество будет превышено, работа ftw() немного замедляется, так как каталоги будут закрываться и снова открываться. ftw() использует в целом один описатель файлов для работы с каждым уровнем файловой иерархии.
Для остановки исследования дерева каталогов fn() возвращает ненулевое значение; оно станет возвращаемым значением для ftw(). Иначе ftw() будет продолжать свой поиск, пока не исследует все дерево полностью (в этом случае она возвратит ноль) или пока не появится ошибка, отличная от ошибок EACCES (таких, как ошибки malloc(3)). В этом случае функция возвратит значение -1.
Так как ftw() использует динамическую структуру данных, то единственным безопасным способом для выхода из процесса перемещения по дереву будет возврат ненулевого значения. Для обработки прерываний, например, необходимо отметить, что прерывание действительно произошло, и вернуть ненулевое значение. Не следует использовать функцию longjmp(3) до тех пор, пока программа не будет завершаться. Функция nftw() выполняет то же самое, что и ftw(), только имеет еще один параметр, flags, то есть вызывает свои функции еще с одним параметром. Этот параметр flags есть 0 или логическое ИЛИ нескольких следующих параметров:
Если FTW_PHYS выключен, а FTW_DEPTH включен, то функция fn() никогда не будет вызвана для каталога, который является своим потомком.
Функция fn() вызывается с четырьмя параметрами: а) полным путем к элементу, б) указателем на структуру struct stat этого элемента, в) целым, описывающим его тип, и д) указателем на структуру struct FTW. Тип будет одним из следующих: FTW_F, FTW_D, FTW_DNR, FTW_SL, FTW_NS (если значение его равно описанному выше, то FTW_SL будет работать только с указанным флагом FTW_PHYS) или
Структура struct FTW, на которую указывает четвертый аргумент в fn(), имеет, по меньшей мере, поля: base - смещение на имя файла в полном его имени, заданное в первом параметре fn(); а также level (это глубина элемента относительно начальной точки с глубиной 0).
В некоторых системах ftw() никогда не использует FTW_SL, на других FTW_SL используется тольуо для символьных ссылок которые не указывают на существующий файл, а еще есть системы, на которых ftw() использует FTW_SL для каждой символьной ссылки. Для точного контроля используйте nftw().
В Linux libc4, libc5 и glibc 2.0.6 будут использовать FTW_F для работы всех объектов (файлов, символьных ссылок, каналов и т.п.), которые могут иметь определенный статус, но не являются директориями. Функция nftw() появилась начиная с glibc 2.1.
Закладки на сайте Проследить за страницей |
Created 1996-2024 by Maxim Chirkov Добавить, Поддержать, Вебмастеру |