Avec quel fichier d'en-tête dois-je appeler #include
pour pouvoir utiliser PATH_MAX comme int pour dimensionner une chaîne?
Je souhaite pouvoir déclarer:
char *current_path[PATH_MAX];
Mais quand je le fais, mon compilateur (Clang / LLVM sous Linux) émet l'erreur suivante:
recursive_find6.c:29:20: error: use of undeclared identifier 'PATH_MAX'
char *current_path[PATH_MAX];
^
J'ai essayé de faire une recherche sur Google mais toujours pas de chance.
#include <limits.h>
NE résout PAS le problème / l'erreur.
Ai-je également raison de dire que la valeur de PATH_MAX est un int?
char current_path[PATH_MAX];
au lieu dechar *current_path[PATH_MAX];
- vous voulez une chaîne plutôt qu'un tableau de pointeurs.Réponses:
C'est dedans
linux/limits.h
.#define PATH_MAX 4096 /* # chars in a path name including nul */
PATH_MAX
a quelques défauts comme mentionné dans ce blog (merci paulsm4)la source
<limits.h>
dit: Une définition de l'une des constantes symboliques de la liste suivante doit être omise de l'en-<limits.h>
tête […] où la valeur correspondante est égale ou supérieure au minimum indiqué, mais où la valeur peut varier en fonction du fichier auquel il s’applique. La valeur réelle prise en charge pour un chemin spécifique doit être fournie par la fonction pathconf ().Sachez qu'il n'est toujours pas clair si
PATH_MAX
définit une longueur maximale avec ou sans un octet nul à la fin. Il peut s'agir de l'un ou de l'autre sur différents systèmes d'exploitation. Si vous ne pouvez pas ou ne voulez pas vérifier de quel cas il s'agit lors de la compilation, il est plus sûr de forcer la limite artificielle dePATH_MAX - 1
. Mieux vaut prévenir que guérir. (De toute évidence, vous devez toujours réserver au moins desPATH_MAX
octets de mémoire pour mettre en mémoire tampon la chaîne.)la source
{PATH_MAX}
Nombre maximum d'octets dans un chemin, y compris le caractère nul de fin. À partir de POSIX '01.<limits.h>
(Justification): {PATH_MAX} L'interprétation IEEE PASC 1003.1 # 15 a résolu l'incohérence de la norme avec la définition du chemin d'accès et la description de {PATH_MAX}, permettant aux développeurs d'applications d'allouer soit {PATH_MAX}, soit {PATH_MAX} +1 octets. L'incohérence a été supprimée par correction de la définition {PATH_MAX} pour inclure le caractère nul. Avec ce changement, les applications qui allouaient auparavant {PATH_MAX} octets continueront de réussir.PATH_MAX - 1
, maisPATH_MAX + 1
. Vous n'êtes plus obligé de le faire, mais vous souhaitez ajouter un octet pour le'\0'
.La façon portable de le faire est:
Spécification: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/limits.h.html
la source
PATH_MAX
n'a pas à être définie: "Une définition de l'une des constantes symboliques de la liste suivante doit être omise de l'en-<limits.h>
tête sur des implémentations spécifiques où la valeur correspondante est égale ou supérieure au minimum indiqué, mais où la valeur peut varier en fonction sur le fichier auquel il est appliqué. La valeur réelle prise en charge pour un chemin spécifique doit être fournie par lapathconf()
fonction. " Étant donné que les systèmes de fichiers Linux prennent en charge des valeurs différentes, c'est probablement une violation du standard POSIX pour Linux à définirPATH_MAX
.Lors de la programmation simple en C, j'ai rencontré le même défi. Sur votre système Linux particulier, le répertoire / usr / include contient de nombreux fichiers d'en-tête spécifiques à un système d'exploitation Linux.
Vous devriez voir plusieurs en-têtes définissant PATH_MAX; malheureusement, cette valeur a été définie différemment dans différents en-têtes. Voici une liste de mon Ubuntu (j'ai également supprimé manuellement certains faux positifs du programme grep).
L'en-tête /linux/limits.h avait le plus grand nombre et devrait être le plus authentique à inclure. Une autre stratégie consiste à définir le vôtre avec un nom différent, disons PATHLEN (4080 est assez long pour la plupart des situations pratiques). Mon objectif principal est d'apprendre à utiliser find pour rechercher des réponses à votre question.
la source
PATH_MAX est une limite système. Il existe trois catégories concernant les limites du système dans l'environnement POSIX. L'une de ces catégories est les valeurs de variable de chemin . Les limites système qui dépendent du système de fichiers appartiennent à cette catégorie. PATHMAX est également la valeur de la variable de chemin. (donc cette valeur peut changer du système de fichiers au système de fichiers.) Ainsi, la limite PATHNAME peut être obtenue avec les fonctions POSIX de pathconf () / fpathconf () . Cette façon est un moyen portable d'obtenir la limite PATHNAME d'un système de fichiers spécifique. L'exemple de code est comme ci-dessous:
la source