Où est PATH_MAX défini dans Linux?
Qui en-tête de fichier dois-je appeler avec #include
pour être en mesure d'utiliser PATH_MAX comme un int pour le dimensionnement d'une chaîne de caractères?
Je veux être en mesure de déclarer:
char *current_path[PATH_MAX];
Mais quand je le fais mon compilateur (Clang/LLVM sur Linux) émet le message d'erreur suivant:
recursive_find6.c:29:20: error: use of undeclared identifier 'PATH_MAX'
char *current_path[PATH_MAX];
^
J'ai essayé de faire une recherche google, mais toujours pas de chance.
#include <limits.h>
Ne permet PAS de résoudre le problème ou l'erreur.
Suis-je aussi correcte que la valeur de PATH_MAX est un int?
- Reportez-vous à cette question: stackoverflow.com/questions/833291/...
- Vous voulez probablement
char current_path[PATH_MAX];
au lieu dechar *current_path[PATH_MAX];
- vous voulez une chaîne plutôt qu'un tableau de pointeurs. - ou celui-ci stackoverflow.com/questions/4267390/...
Vous devez vous connecter pour publier un commentaire.
Son
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)<limits.h>
dit: la définition de l'une des constantes symboliques dans la liste suivante doit être omis de la<limits.h>
en-tête [...] lorsque la valeur est égale ou supérieure au minimum, mais où la valeur peut varier selon le type de fichier pour lequel il est appliqué. La valeur réelle pris en charge pour un chemin d'accès doit être fourni par le pathconf() de la fonction.{NAME_MAX}
• nombre Maximum d'octets dans un fichier (non compris la valeur null d'un nom de fichier de la chaîne). • Minimum Acceptable de la Valeur: {_POSIX_NAME_MAX} • Minimum Acceptable de la Valeur: {_XOPEN_NAME_MAX} et{PATH_MAX}
• nombre Maximal d'octets de la mise en oeuvre en magasin comme un chemin dans un tampon fourni de taille quelconque, y compris le caractère de fin null. Nombre minimal de la mise en œuvre acceptera que le nombre maximal d'octets dans un chemin. • Minimum Acceptable de la Valeur: {_POSIX_PATH_MAX} • Minimum Acceptable de la Valeur: {_XOPEN_PATH_MAX}Être conscient qu'il est encore difficile de savoir si
PATH_MAX
définit une longueur maximale avec ou sans fuite nul byte. Il peut être l'un ou l'autre sur différents systèmes d'exploitation. Si vous ne pouvez pas ou ne veulent pas, auquel cas c'est lors de la compilation, il est plus sûr de la force limite artificielle dePATH_MAX - 1
. Mieux vaut prévenir que guérir. (Évidemment, vous avez encore besoin de réserver au moinsPATH_MAX
octets de la mémoire tampon la chaîne).{PATH_MAX}
nombre Maximum d'octets dans un chemin d'accès, y compris le caractère de fin null. De POSIX '01.<limits.h>
(Justification): {PATH_MAX} IEEE PASC Interprétation 1003.1 #15 adressé à l'incohérence dans 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 {PATH_MAX} ou {PATH_MAX}+1 octets. L'incohérence a été supprimé par la correction de l' {PATH_MAX} définition pour inclure le caractère null. Avec ce changement, les applications précédemment allouée {PATH_MAX} octets de continuer à réussir.PATH_MAX - 1
, maisPATH_MAX + 1
. Vous n'avez pas à plus, mais vous souhaitez ajouter un octet pour le'\0'
.C'est une bonne question. Je suis une simple programmation en C et rencontré ce problème. Sur votre Linux/Unix, afin de /usr/include répertoire, voici tous les fichiers d'en-tête pour votre système.
Vous devriez voir plusieurs en-têtes de la définition de PATH_MAX. Et vous pouvez voir que cette valeur est définie différemment selon les endroits. Voici une liste de mon Ubuntu (j'ai aussi supprimé manuellement certains faux positifs de la commande grep programme).
Ressemble /linux/limites.h a le plus grand nombre défini. Je ne inquiétude au sujet de la portabilité de ce fichier. Donc, pour être sûr que vous pourriez simplement défini cette MACRO vous-même avec un nom différent, dire de longueur de chemin (4080 est assez long pour la plupart des situations pratiques). Si c'est pour un gros paquet de logiciel, vous avez également le contrôle. C'est mon opinion.
Le portable façon de le faire est: