ftw
Section: C Library Functions (3)
Updated: 5 février 2023
Index
Return to Main Contents
NOM
ftw, nftw - Parcourir des arborescences de fichiers
BIBLIOTHÈQUE
Bibliothèque C standard (libc, -lc)
SYNOPSIS
#include <ftw.h>
int nftw(const char *chemin_répertoire,
int (*fn)(const char *chemin_fichier, const struct stat *sb,
int symbole_type, struct FTW *tampon_ftw),
int nb_descripteurs_fichier_ouverts, int drapeaux);
[[deprecated]]
int ftw(const char *chemin_répertoire,
int (*fn) (const char *chemin_fichier, const struct stat *sb,
int symbole_type),
int nb_descripteurs_fichier_ouverts);
Exigences de macros de test de fonctionnalités pour la glibc (consulter
feature_test_macros(7)) :
nftw() :
_XOPEN_SOURCE >= 500
DESCRIPTION
La fonction nftw() parcourt l'arborescence de fichiers située dans le
répertoire chemin_répertoire et appelle fn() une fois pour chaque
entrée de l'arborescence. Par défaut, les répertoires sont traités avant les
fichiers et sous-répertoires qu'ils contiennent (méthode de parcours
« preorder »).
Afin d'éviter d'utiliser tous les descripteurs de fichier du processus
appelant, nb_descripteurs_fichier_ouverts indique le nombre maximal de
répertoires que nftw() peut ouvrir simultanément. Lorsque la profondeur
de recherche est supérieure à cette valeur, nftw() ralentit car les
répertoires doivent être fermés puis réouverts. nftw() utilise au plus un
descripteur de fichier pour chaque niveau dans l'arborescence des fichiers.
Pour chaque entrée trouvée dans l'arbre, nftw() appelle fn() avec
quatre arguments : chemin_fichier, sb, symbole_type et
tampon_ftw. chemin_fichier est le chemin de l'entrée ; il est défini
comme un chemin relatif au répertoire de travail actuel du processus
appelant au moment de l'appel à nftw() si chemin_répertoire est un
chemin relatif, ou comme un chemin absolu si chemin_répertoire est un
chemin absolu. sb est un pointeur vers la structure stat renvoyée par
un appel à stat(2) pour chemin_fichier.
L'argument symbole_type passé à fn() est un entier qui peut prendre
une des valeurs suivantes :
- FTW_F
-
chemin_fichier est un fichier ordinaire.
- FTW_D
-
chemin_fichier est un répertoire.
- FTW_DNR
-
chemin_fichier est un répertoire qui ne peut être lu.
- FTW_DP
-
chemin_fichier est un répertoire et FTW_DEPTH a été défini dans
drapeaux (si FTW_DEPTH n’est pas défini dans drapeaux, alors les
répertoires seront toujours visités avec symbole_type défini à
FTW_D). Tous les fichiers et sous-répertoires dans chemin_fichier ont
été traités.
- FTW_NS
-
L'appel stat(2) a échoué sur chemin_fichier qui n'est pas un lien
symbolique. Cela est probablement dû au fait que l’appelant avait les droits
de lecture sur le répertoire parent de telle sorte que chemin_fichier
était visible, mais n’avait pas les droits d’exécution, et donc le fichier
ne pouvait pas être atteint pour stat(2). Le contenu du tampon pointé par
sb est indéterminé.
- FTW_SL
-
chemin_fichier est un lien symbolique et FTW_PHYS a été défini dans
drapeaux.
- FTW_SLN
-
chemin_fichier est un lien symbolique pointant vers un fichier qui
n'existe pas (ce qui ne se produira que si FTW_PHYS n'est pas
défini). Dans ce cas, l'argument sb passé à fn() contiendra les
informations renvoyées par l'exécution de lstat(2) sur le lien symbolique
pointant nulle part (voir à ce sujet BOGUES).
Le quatrième argument (tampon_ftw), spécifié par nftw() lors de
l'appel de fn, est un pointeur vers une structure du type FTW :
struct FTW {
int base;
int level;
};
base est le décalage du nom de fichier (c’est-à-dire le composant « basename ») du chemin donné par chemin_fichier. level est la
profondeur de chemin_fichier dans l'arbre des répertoires, relative à la
racine de l'arbre (chemin_répertoire qui a une profondeur de 0).
Pour arrêter le parcours de l'arborescence des fichiers, la fonction fn()
renvoie une valeur différente de 0, qui deviendra la valeur de retour de
nftw(). Tant que fn() renvoie 0, nftw() continuera jusqu'à la
fin du parcours de l'arborescence, et dans ce cas renverra 0, ou jusqu'à
ce qu'une erreur se produise (comme un échec de malloc(3)) et dans ce cas
renverra -1.
Comme nftw() utilise des structures de données allouées dynamiquement, la
seule manière propre de sortir d'un parcours d'arborescence consiste à faire
que fn() renvoie une valeur différente de 0. Pour permettre à un
signal de terminer le parcours sans causer de fuite de mémoire, utilisez un
gestionnaire qui définit un attribut global vérifié par
fn(). N'utilisez pas longjmp(3) à moins que le programme ne soit
sur le point de se terminer.
L'argument drapeaux de nftw() est un OU binaire entre zéro ou
plusieurs des attributs suivants :
- FTW_ACTIONRETVAL (depuis la glibc 2.3.3)
-
Si cet attribut, spécifique à la glibc, est positionné, alors nftw() gère
la valeur de retour de fn() différemment. fn() doit renvoyer l'une des
valeurs suivantes :
-
- FTW_CONTINUE
-
nftw() doit continuer normalement.
- FTW_SKIP_SIBLINGS
-
Si fn() renvoie cette valeur, alors les entrées de même niveau que
l'entrée courante seront sautées, et la procédure continuera avec le parent.
- FTW_SKIP_SUBTREE
-
Si fn() est appelée avec une entrée qui est un répertoire
(symbole_type a pour valeur FTW_D), cette valeur de retour empêchera
le passage des objets de ce répertoire comme arguments à fn() et
nftw() continuera avec l'entrée suivante de même niveau du répertoire.
- FTW_STOP
-
nftw() doit quitter immédiatement avec la valeur de retour FTW_STOP.
D'autres valeurs de retour pourront être associées à de nouvelles actions
dans le futur ; fn ne devrait renvoyer que les valeurs citées ci-dessus.
La macro de test _GNU_SOURCE doit être définie (avant toute inclusion
de fichiers d'en-tête) afin d'obtenir la définition de FTW_ACTIONRETVAL
depuis <ftw.h>.
- FTW_CHDIR
-
Si cet attribut est défini, faire un chdir(2) vers chaque répertoire
avant de traiter son contenu. Cela est utile si le programme doit exécuter
des actions dans le répertoire où chemin_fichier réside (préciser ce
drapeau n’a aucun effet sur le nom de chemin passé dans l’argument de
chemin_fichier de fn).
- FTW_DEPTH
-
Si cet attribut est défini, faire une recherche « postorder » ;
c'est-à-dire, appeler fn() pour le répertoire lui-même après avoir
traité son contenu et celui de ses sous-répertoires (par défaut chaque
répertoire est traité avant son contenu).
- FTW_MOUNT
-
Si cet attribut est défini, rester dans le même système de fichiers
(c’est-à-dire, ne pas traverser vers d'autres points de montage).
- FTW_PHYS
-
Si cet attribut est défini, ne pas suivre les liens symboliques (c'est ce
que l'on veut). S'il n'est pas défini, les liens symboliques sont suivis,
mais aucun fichier n'est traité plus d'une fois.
-
Si FTW_PHYS n'est pas défini, mais si FTW_DEPTH l'est, alors la
fonction fn() n'est jamais appelée pour un répertoire qui ferait partie
de ses propres descendants.
ftw()
ftw() est une fonction plus ancienne qui prend en charge un sous-ensemble
des fonctionnalités de nftw(). Les différences notables sont les
suivantes :
- •
-
ftw() n'a pas d'argument drapeaux. Elle se comporte comme nftw()
lorsque cette dernière est appelée avec l'argument drapeaux défini à
zéro.
- •
-
La fonction de rappel fn() est fournie sans le quatrième argument.
- •
-
Le jeu de valeurs passées à l'aide de l'argument symbole_type à fn()
est plus petit : les seules valeurs valables sont FTW_F, FTW_D,
FTW_DNR, FTW_NS et (peut-être) FTW_SL.
VALEUR RENVOYÉE
Ces fonctions renvoient 0 en cas de succès et -1 en cas d'erreur.
Si fn() renvoie une valeur différente de 0, alors le parcours de
l'arbre se termine et la valeur renvoyée par fn() est renvoyée comme
résultat de ftw() ou nftw().
Si nftw() est appelée avec l’attribut FTW_ACTIONRETVAL, alors la seule
valeur différente de 0 qui pourra être utilisée par fn() pour terminer
le parcours de l'arbre est FTW_STOP, et cette valeur est renvoyée comme
résultat de nftw().
VERSIONS
La fonction nftw() est disponible depuis la glibc 2.1.
ATTRIBUTS
Pour une explication des termes utilisés dans cette section, consulter
attributes(7).
Interface | Attribut | Valeur
|
nftw()
| Sécurité des threads | MT-Safe cwd
|
ftw()
| Sécurité des threads | MT-Safe
|
STANDARDS
POSIX.1-2001, POSIX.1-2008, SVr4, SUSv1. POSIX.1-2008 marque ftw() comme
étant obsolète.
NOTES
POSIX.1-2008 indique que les résultats sont imprévisibles si fn ne
préserve pas le répertoire de travail actuel.
La fonction nftw() et l'utilisation de FTW_SL avec ftw() ont été
introduites dans SUSv1.
Dans certaines implémentations (par exemple la glibc), ftw() n'utilise
jamais FTW_SL ; sur d'autres systèmes, FTW_SL n'apparaît que pour les
liens symboliques qui ne pointent vers aucun fichier existant ; sur d'autres
encore, ftw() utilise FTW_SL pour chaque lien symbolique. Si
chemin_fichier est un lien symbolique et si stat(2) échoue,
POSIX.1-2008 indique que le résultat est indéfini si FTW_NS ou FTW_SL
sont définis dans symbole_type. Pour un fonctionnement prévisible,
employez nftw().
BOGUES
Selon POSIX.1-2008, lorsque l'argument symbole_type passé à fn()
contient FTW_SLN, le tampon pointé par sb doit contenir des
informations à propos du lien symbolique pointant nulle part (obtenues en
appelant lstat(2) sur le lien), et les premières versions de la glibc
respectaient la spécification POSIX sur ce point. Cependant, suite à une
régression introduite dans la version 2.4 de la glibc, le contenu du tampon
pointé par sb devint indéfini lorsque FTW_SLN était défini dans
symbole_type (plus précisément, le contenu du tampon restait inchangé
dans ce cas). Cette régression fut finalement corrigée dans la version 2.30
de la glibc de façon à ce que l'implémentation de la glibc suive à nouveau
la spécification POSIX.
EXEMPLES
Le programme suivant parcourt l'arbre des répertoires du chemin donné en
premier argument de la ligne de commande ou du répertoire courant s'il n'est
pas indiqué. Il affiche diverses informations à propos de chaque fichier. Le
second argument de la ligne de commande peut être utilisé pour indiquer les
caractères qui contrôlent la valeur assignée à l'argument drapeaux lors
des appels à nftw().
Source du programme
#define _XOPEN_SOURCE 500
#include <ftw.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
static int
display_info(const char *chemin_fichier, const struct stat *sb,
int symbole_type, struct FTW *tampon_ftw)
{
printf("%-3s %2d ",
(symbole_type == FTW_D) ? "d" : (symbole_type == FTW_DNR) ? "dnr" :
(symbole_type == FTW_DP) ? "dp" : (symbole_type == FTW_F) ? "f" :
(symbole_type == FTW_NS) ? "ns" : (symbole_type == FTW_SL) ? "sl" :
(symbole_type == FTW_SLN) ? "sln" : "???",
tampon_ftw->level);
if (symbole_type == FTW_NS)
printf("-------");
else
printf("%7jd", (intmax_t) sb->st_size);
printf(" %-40s %d %s\n",
chemin_fichier, tampon_ftw->base, chemin_fichier + tampon_ftw->base);
return 0; /* Pour dire à nftw() de continuer */
}
int
main(int argc, char *argv[])
{
int flags = 0;
if (argc > 2 && strchr(argv[2], 'd') != NULL)
flags |= FTW_DEPTH;
if (argc > 2 && strchr(argv[2], 'p') != NULL)
flags |= FTW_PHYS;
if (nftw((argc < 2) ? "." : argv[1], display_info, 20, flags)
== -1)
{
perror("nftw");
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
}
VOIR AUSSI
stat(2), fts(3), readdir(3)
TRADUCTION
La traduction française de cette page de manuel a été créée par
Christophe Blaess <https://www.blaess.fr/christophe/>,
Stéphan Rafin <stephan.rafin@laposte.net>,
Thierry Vignaud <tvignaud@mandriva.com>,
François Micaux,
Alain Portal <aportal@univ-montp2.fr>,
Jean-Philippe Guérard <fevrier@tigreraye.org>,
Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>,
Julien Cristau <jcristau@debian.org>,
Thomas Huriaux <thomas.huriaux@gmail.com>,
Nicolas François <nicolas.francois@centraliens.net>,
Florentin Duneau <fduneau@gmail.com>,
Simon Paillard <simon.paillard@resel.enst-bretagne.fr>,
Denis Barbier <barbier@debian.org>,
David Prévot <david@tilapin.org>
et
Lucien Gentis <lucien.gentis@waika9.com>
Cette traduction est une documentation libre ; veuillez vous reporter à la
GNU General Public License version 3
concernant les conditions de copie et
de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE.
Si vous découvrez un bogue dans la traduction de cette page de manuel,
veuillez envoyer un message à
Index
- NOM
-
- BIBLIOTHÈQUE
-
- SYNOPSIS
-
- DESCRIPTION
-
- ftw()
-
- VALEUR RENVOYÉE
-
- VERSIONS
-
- ATTRIBUTS
-
- STANDARDS
-
- NOTES
-
- BOGUES
-
- EXEMPLES
-
- Source du programme
-
- VOIR AUSSI
-
- TRADUCTION
-
This document was created by
man2html,
using the manual pages.
Time: 06:39:10 GMT, May 18, 2024