.\" -*- coding: UTF-8 -*- '\" t .\" Copyright 1999, Andries E. Brouwer .\" Copyright 2006, Justin Pryzby .\" Copyright 2006, Michael Kerrisk .\" Copyright, the authors of the Linux man-pages project .\" .\" SPDX-License-Identifier: GPL-2.0-or-later .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH ftw 3 "8 февраля 2026 г." "Linux man\-pages 6.18" .SH НАИМЕНОВАНИЕ ftw, nftw \- обход файлового дерева .SH БИБЛИОТЕКА Стандартная библиотека языка C (\fIlibc\fP,\ \fI\-lc\fP) .SH СИНТАКСИС .nf \fB#include \fP .P \fBint nftw(const char *\fP\fIdirpath\fP\fB,\fP \fB typeof(int (const char *\fP\fIfpath\fP\fB, const struct stat *\fP\fIsb,\fP \fB int \fP\fItypeflag\fP\fB, struct FTW *\fP\fIftwbuf\fP\fB))\fP \fB *\fP\fIfn,\fP \fB int \fP\fInopenfd\fP\fB, int \fP\fIflags\fP\fB);\fP .P \fB[[deprecated]]\fP \fBint ftw(const char *\fP\fIdirpath\fP\fB,\fP \fB typeof(int (const char *\fP\fIfpath\fP\fB, const struct stat *\fP\fIsb\fP\fB,\fP \fB int \fP\fItypeflag\fP\fB))\fP \fB *\fP\fIfn,\fP \fB int \fP\fInopenfd\fP\fB);\fP .fi .P .RS -4 Требования макроса тестирования свойств для glibc (см. \fBfeature_test_macros\fP(7)): .RE .P \fBnftw\fP(): .nf _XOPEN_SOURCE >= 500 .fi .SH ОПИСАНИЕ \fBnftw\fP() walks through the directory tree that is located under the directory \fIdirpath\fP, and calls \fIfn\fP() once for each entry in the tree. By default, directories are handled before the files and subdirectories they contain (preorder traversal). .P Чтобы избежать использования всех файловых дескрипторов вызывающего процесса, в \fInopenfd\fP задаётся максимальное количество одновременно открываемых \fBnftw\fP() каталогов. Когда это количество превышается, работа \fBnftw\fP() немного замедляется, так как каталоги будут закрываться и снова открываться. Функция \fBnftw\fP() использует не более одного файлового дескриптора для работы с каждым уровнем дерева каталогов. .P For each entry found in the tree, \fBnftw\fP() calls \fIfn\fP() with four arguments: \fIfpath\fP, \fIsb\fP, \fItypeflag\fP, and \fIftwbuf\fP. \fIfpath\fP is the pathname of the entry, and is expressed either as a pathname relative to the calling process's current working directory at the time of the call to \fBnftw\fP(), if \fIdirpath\fP was expressed as a relative pathname, or as an absolute pathname, if \fIdirpath\fP was expressed as an absolute pathname. \fIsb\fP is a pointer to the \fIstat\fP structure returned by a call to \fBstat\fP(2) for \fIfpath\fP. .P Аргумент \fItypeflag\fP, передаваемый в \fIfn\fP(), представляет собой целое число, которое может быть одним из следующих значений: .TP \fBFTW_F\fP \fIfpath\fP обычный файл .TP \fBFTW_D\fP \fIfpath\fP каталог .TP \fBFTW_DNR\fP \fIfpath\fP каталог, который не может быть прочитан .TP \fBFTW_DP\fP \fIfpath\fP является каталогом, и в \fIflags\fP установлен \fBFTW_DEPTH\fP (если \fBFTW_DEPTH\fP отсутствует в \fIflags\fP, то каталоги всегда будут просматриваться с \fItypeflag\fP равным \fBFTW_D\fP). Обработаны все файлы и подкаталоги в \fIfpath\fP. .TP \fBFTW_NS\fP Вызов \fBstat\fP(2) завершился с ошибкой для \fIfpath\fP, который не является символьной ссылкой. Вероятно, проблема в том, что вызывающий имеет право на чтение родительского каталога, и поэтому файл с именем \fIfpath\fP доступен, но не имеет права выполнения, и поэтому файл недоступен для \fBstat\fP(2). Содержимое буфера, указываемого \fIsb\fP, не определено. .TP \fBFTW_SL\fP .\" To obtain the definition of this constant from .\" .IR , .\" either .\" .B _BSD_SOURCE .\" must be defined, or .\" .BR _XOPEN_SOURCE .\" must be defined with a value of 500 or more. \fIfpath\fP является символьной ссылкой и в \fIflags\fP установлен \fBFTW_PHYS\fP. .TP \fBFTW_SLN\fP \fIfpath\fP is a symbolic link pointing to a nonexistent file. (This occurs only if \fBFTW_PHYS\fP is not set.) In this case the \fIsb\fP argument passed to \fIfn\fP() contains information returned by performing \fBlstat\fP(2) on the "dangling" symbolic link. (But see BUGS.) .P Четвёртый аргумент (\fIftwbuf\fP), передаваемый \fBnftw\fP() при вызове \fIfn\fP(), является структурой типа \fIFTW\fP: .P .in +4n .EX struct FTW { int base; int level; }; .EE .in .P \fIbase\fP — смещение на имя файла (т.е. базовая часть) в пути, заданном в \fIfpath\fP. \fIlevel\fP — глубина \fIfpath\fP в дереве каталогов относительно корня дерева (\fIdirpath\fP имеет глубину 0). .P To stop the tree walk, \fIfn\fP() returns a nonzero value; this value will become the return value of \fBnftw\fP(). As long as \fIfn\fP() returns 0, \fBnftw\fP() will continue either until it has traversed the entire tree, in which case it will return zero, or until it encounters an error (such as a \fBmalloc\fP(3) failure), in which case it will return \-1. .P Так как \fBnftw\fP() использует динамические структуры данных, то единственным безопасным способом для выхода из процесса обхода дерева будет возврат ненулевого значения из \fIfn\fP(). Для завершения обхода по сигналу без утечек памяти в обработчике нужно устанавливать глобальный флаг, проверяемый \fIfn\fP(). \fIНе\fP используйте \fBlongjmp\fP(3) кроме как для завершения программы. .P Значение аргумента \fIflags\fP в \fBnftw\fP() составляется логическим сложением 0 или нескольких следующих флагов: .TP \fBFTW_ACTIONRETVAL\fP (начиная с glibc 2.3.3) Если этот флаг, имеющийся только в glibc, не задан, то \fBnftw\fP() по другому обрабатывает полученное от \fIfn\fP() значение. Вызов \fIfn\fP() должен возвращать одно из следующих значений: .RS .TP \fBFTW_CONTINUE\fP Указывает \fBnftw\fP() продолжать обычную работу. .TP \fBFTW_SKIP_SIBLINGS\fP .\" If \f[B]FTW_DEPTH\f[] .\" is set, the entry's parent directory is processed next (with .\" \f[I]flag\f[] set to \f[B]FTW_DP\f[]). If \fIfn\fP() returns this value, then siblings of the current entry will be skipped, and processing continues in the parent. .TP \fBFTW_SKIP_SUBTREE\fP If \fIfn\fP() is called with an entry that is a directory (\fItypeflag\fP is \fBFTW_D\fP), this return value will prevent objects within that directory from being passed as arguments to \fIfn\fP(). \fBnftw\fP() continues processing with the next sibling of the directory. .TP \fBFTW_STOP\fP Заставляет \fBnftw\fP() немедленно завершить работу со значением \fBFTW_STOP\fP. .P Other return values could be associated with new actions in the future; \fIfn\fP() should not return values other than those listed above. .P Чтобы получить определение \fBFTW_ACTIONRETVAL\fP из \fI\fP, должен быть определён макрос тестирования свойств \fB_GNU_SOURCE\fP. .RE .TP \fBFTW_CHDIR\fP Если установлен этот флаг, то будет выполняться \fBchdir\fP(2) для каждого каталога перед обработкой его содержимого. Это полезно, если программе требуется выполнить какое\-то действие в каталоге, в котором расположен \fIfpath\fP (наличие данного флага не влияет на путь, который передаётся в \fIfpath\fP аргумента \fIfn\fP). .TP \fBFTW_DEPTH\fP If set, do a post\-order traversal, that is, call \fIfn\fP() for the directory itself \fIafter\fP handling the contents of the directory and its subdirectories. (By default, each directory is handled \fIbefore\fP its contents.) .TP \fBFTW_MOUNT\fP Если установлен этот флаг, то оставаться в пределах одной файловой системы (т.е. не переходить в другую точку монтирования). .TP \fBFTW_PHYS\fP Если установлен этот флаг, то не следовать по символьным ссылкам (то, что обычно нужно). Если флаг не задан, то выполняется переход по символьным ссылкам, но ни один файл не будет обработан дважды. .IP Если \fBFTW_PHYS\fP не задан, но задан \fBFTW_DEPTH\fP, то функция \fIfn\fP() никогда не будет вызвана для каталога, который является потомком самого себя. .SS ftw() Функция \fBftw\fP() является устаревшей и предоставляет только часть возможностей \fBnftw\fP(). Основные отличия: .IP \[bu] 3 В \fBftw\fP() нет аргумента \fIflags\fP. Она действует также, как если бы \fBnftw\fP() вызвали со значением \fIflags\fP равным нулю. .IP \[bu] Функции обратного вызова \fIfn\fP() не передаётся четвёртый аргумент. .IP \[bu] Диапазон значений, передаваемый в аргументе \fItypeflag\fP для \fIfn\fP() меньше: \fBFTW_F\fP, \fBFTW_D\fP, \fBFTW_DNR\fP, \fBFTW_NS\fP и (возможно) \fBFTW_SL\fP. .SH "ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ" При успешном выполнении эти функции возвращают 0 и \-1 при ошибке. .P If \fIfn\fP() returns nonzero, then the tree walk is terminated and the value returned by \fIfn\fP() is returned as the result of \fBftw\fP() or \fBnftw\fP(). .P Если \fBnftw\fP() вызывается с флагом \fBFTW_ACTIONRETVAL\fP, то для прекращения обхода дерева \fIfn\fP() должна вернуть ненулевое значение \fBFTW_STOP\fP, и это значение возвращается в качестве результата \fBnftw\fP(). .SH АТРИБУТЫ Описание терминов данного раздела смотрите в \fBattributes\fP(7). .TS allbox; lbx lb lb l l l. Интерфейс Атрибут Значение T{ .na .nh \fBnftw\fP() T} Безвредность в нитях MT\-Safe cwd T{ .na .nh \fBftw\fP() T} Безвредность в нитях MT\-Safe .TE .SH ВЕРСИИ In some implementations (e.g., glibc), \fBftw\fP() will never use \fBFTW_SL\fP; on other systems \fBFTW_SL\fP occurs only for symbolic links that do not point to an existing file; and again on other systems \fBftw\fP() will use \fBFTW_SL\fP for each symbolic link. If \fIfpath\fP is a symbolic link and \fBstat\fP(2) failed, POSIX.1\-2008 states that it is undefined whether \fBFTW_NS\fP or \fBFTW_SL\fP is passed in \fItypeflag\fP. For predictable results, use \fBnftw\fP(). .SH СТАНДАРТЫ POSIX.1\-2008. .SH ИСТОРИЯ .TP \fBftw\fP() POSIX.1\-2001, SVr4, SUSv1. POSIX.1\-2008 marks it as obsolete. .TP \fBnftw\fP() glibc 2.1. POSIX.1\-2001, SUSv1. .TP \fBFTW_SL\fP POSIX.1\-2001, SUSv1. .SH ПРИМЕЧАНИЯ В POSIX.1\-2008 отмечено, что результат непредсказуем, если \fIfn\fP не сохраняет текущий рабочий каталог. .SH "ПРОГРАММНЫЕ ОШИБКИ" .\" https://bugzilla.redhat.com/show_bug.cgi?id=1422736 .\" http://austingroupbugs.net/view.php?id=1121 .\" glibc commit 6ba205b2c35e3e024c8c12d2ee1b73363e84da87 .\" https://sourceware.org/bugzilla/show_bug.cgi?id=23501 According to POSIX.1\-2008, when the \fItypeflag\fP argument passed to \fIfn\fP() contains \fBFTW_SLN\fP, the buffer pointed to by \fIsb\fP should contain information about the dangling symbolic link (obtained by calling \fBlstat\fP(2) on the link). Early glibc versions correctly followed the POSIX specification on this point. However, as a result of a regression introduced in glibc 2.4, the contents of the buffer pointed to by \fIsb\fP were undefined when \fBFTW_SLN\fP is passed in \fItypeflag\fP. (More precisely, the contents of the buffer were left unchanged in this case.) This regression was eventually fixed in glibc 2.30, so that the glibc implementation (once more) follows the POSIX specification. .SH ПРИМЕРЫ Следующая программа обходит дерево каталогов начиная с пути, указанном в первом аргументе командой строки или начиная с текущего каталога, если аргумент не указан. Она отображает различную информацию о каждом файле. Во втором параметре можно указать символы, которые управляют содержимым аргумента \fIflags\fP у \fBnftw\fP(). .SS "Исходный код программы" .\" SRC BEGIN (ftw.c) \& .EX #define _XOPEN_SOURCE 500 #include #include #include #include #include \& static int display_info(const char *fpath, const struct stat *sb, int tflag, struct FTW *ftwbuf) { printf("%\-3s %2d ", (tflag == FTW_D) ? "d" : (tflag == FTW_DNR) ? "dnr" : (tflag == FTW_DP) ? "dp" : (tflag == FTW_F) ? "f" : (tflag == FTW_NS) ? "ns" : (tflag == FTW_SL) ? "sl" : (tflag == FTW_SLN) ? "sln" : "???", ftwbuf\->level); \& if (tflag == FTW_NS) printf("\-\-\-\-\-\-\-"); else printf("%7jd", (intmax_t) sb\->st_size); \& printf(" %\-40s %d %s\[rs]n", fpath, ftwbuf\->base, fpath + ftwbuf\->base); \& return 0; /* To tell nftw() to continue */ } \& int main(int argc, char *argv[]) { int flags = 0; \& if (argc > 2 && strchr(argv[2], \[aq]d\[aq]) != NULL) flags |= FTW_DEPTH; if (argc > 2 && strchr(argv[2], \[aq]p\[aq]) != NULL) flags |= FTW_PHYS; \& if (nftw((argc < 2) ? "." : argv[1], display_info, 20, flags) == \-1) { perror("nftw"); exit(EXIT_FAILURE); } \& exit(EXIT_SUCCESS); } .EE .\" SRC END .SH "СМОТРИТЕ ТАКЖЕ" \fBstat\fP(2), \fBfts\fP(3), \fBreaddir\fP(3) .PP .SH ПЕРЕВОД Русский перевод этой страницы руководства разработал(и) Azamat Hackimov , Dmitry Bolkhovskikh , Yuri Kozlov и Иван Павлов . .PP Этот перевод является свободной программной документацией; он распространяется на условиях общедоступной лицензии GNU (GNU General Public License - GPL, .UR https://www.gnu.org/licenses/gpl-3.0.html .UE версии 3 или более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ. .PP Если вы обнаружите какие-либо ошибки в переводе этой страницы руководства, пожалуйста, сообщите об этом разработчику(ам) по его(их) адресу(ам) электронной почты или по адресу .MT debian-l10n-russian@lists.debian.org списка рассылки русских переводчиков .ME .