143 votes

Où est défini PATH_MAX dans Linux ?

Quel fichier d'en-tête dois-je invoquer avec #include pour pouvoir utiliser PATH_MAX comme un int pour dimensionner une chaîne de caractères ?

Je veux pouvoir déclarer :

char *current_path[PATH_MAX];

Mais lorsque 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 je n'ai toujours rien trouvé.

#include <limits.h> Ne résout PAS le problème/l'erreur.

Ai-je raison de dire que la valeur de PATH_MAX est un nombre entier ?

3 votes

Veuillez consulter cette question : stackoverflow.com/questions/833291/

23 votes

Vous souhaitez probablement char current_path[PATH_MAX]; au lieu de char *current_path[PATH_MAX]; - vous voulez une chaîne de caractères plutôt qu'un tableau de pointeurs.

0 votes

172voto

shiplu.mokadd.im Points 28895

Son en linux/limits.h .
#define PATH_MAX 4096 /* # chars in a path name including nul */

#include <linux/limits.h>

char current_path[PATH_MAX];

PATH_MAX a quelques défauts, comme indiqué dans ce blog (merci paulsm4)

30 votes

Voici un bon lien sur PATH_MAX ... et pourquoi il est simple n'est pas : insanecoding.blogspot.com/2007/11/pathmax-simplement-isnt.html

1 votes

Attendez ... cela signifie-t-il que PATH_MAX est spécifique à linux et ne fait partie d'aucune norme ?

8 votes

Vous devriez probablement utiliser <limits.h> ; <linux/limits.h> semble nettement non portable.

18voto

Kumashiro Points 59

Il faut savoir qu'il n'est pas encore clair si PATH_MAX définit une longueur maximale avec ou sans 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 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 de PATH_MAX - 1 . Mieux vaut prévenir que guérir. (Il est évident que vous devez toujours réserver au moins PATH_MAX octets de mémoire pour mettre la chaîne en mémoire tampon).

5 votes

> {PATH_MAX} Nombre maximal d'octets dans un nom de chemin, y compris le caractère nul de fin. Tiré de POSIX '01.

11 votes

Notez que POSIX 2008 a résolu la confusion - <limits.h> (Raison d'être) : {L'interprétation IEEE PASC 1003.1 #15 a corrigé l'incohérence de la norme avec la définition du nom de chemin 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 une correction de la définition de {PATH_MAX} afin d'inclure le caractère nul. Grâce à cette modification, les applications qui allouaient auparavant {PATH_MAX} octets continueront à fonctionner.

3 votes

Notez également que vous ne devez pas utiliser PATH_MAX - 1 mais PATH_MAX + 1 . Vous n'êtes plus obligé de le faire, mais vous voulez ajouter un octet pour le '\0' .

13voto

emersion Points 313

La manière portable de procéder est la suivante :

#define _POSIX_C_SOURCE 1
#include <limits.h>

Spec : https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/limits.h.html

1 votes

Et même cela ne suffit pas. PATH_MAX ne doit pas être défini : "Une définition de l'une des constantes symboliques de la liste suivante sont omises de la <limits.h> 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 du fichier auquel elle s'applique. La valeur réelle prise en charge pour un nom de chemin spécifique est fournie par l'en-tête pathconf() fonction". Étant donné que les systèmes de fichiers Linux prennent en charge différentes valeurs, c'est probablement une violation de la norme POSIX pour Linux que de définir PATH_MAX .

0 votes

J'ai PATH_MAX dans linux/limits.h mais limits.h n'intègre pas ce fichier, même avec cette définition =/

0 votes

Qu'est-ce qu'une définition ? _POSIX_C_SOURCE faire ? On m'a dit qu'il fallait jamais définir une variable commençant par un _ dans son programme.

5voto

muh karma Points 51

@Kumashiro

{ Nombre maximal d'octets dans un nom de chemin, y compris le caractère nul de fin.

Tiré de POSIX '01.

Vous devez avoir une réputation de 50 pour pouvoir commenter.

Au moins, je peux avoir un peu de ce doux, doux karma maintenant.

5voto

Kemin Zhou Points 31

Lors d'une simple programmation en C, j'ai rencontré le même problème. Sur votre système Linux, le répertoire /usr/include contient de nombreux fichiers d'en-tête spécifiques au système d'exploitation Linux.

find . -name "*.h" | xargs grep PATH_MAX 

Vous devriez voir plusieurs en-têtes définissant PATH_MAX ; malheureusement, cette valeur est définie différemment selon les en-têtes. Voici une liste provenant de mon Ubuntu (j'ai également supprimé manuellement quelques faux positifs du programme grep).

./x86_64-linux-gnu/bits/posix1_lim.h:#define _POSIX_PATH_MAX      256
./X11/InitialI.h:#ifndef PATH_MAX
./X11/InitialI.h:#define PATH_MAX 512
./X11/InitialI.h:#ifndef PATH_MAX
./X11/InitialI.h:#define PATH_MAX MAXPATHLEN
./X11/InitialI.h:#define PATH_MAX 1024
./X11/Xos.h:#  define PATH_MAX 4096
./X11/Xwindows.h:#if defined(WIN32) && (!defined(PATH_MAX) || PATH_MAX < 1024)
./X11/Xwindows.h:# undef PATH_MAX
./X11/Xwindows.h:# define PATH_MAX 1024
./X11/Xosdefs.h:#  ifndef PATH_MAX
./X11/Xosdefs.h:#   define PATH_MAX 4096
./X11/Xosdefs.h:#  ifndef PATH_MAX
./X11/Xosdefs.h:#   define PATH_MAX 1024
./X11/extensions/XKBsrv.h:#define   PATH_MAX MAXPATHLEN
./X11/extensions/XKBsrv.h:#define   PATH_MAX 1024
./python2.7/osdefs.h:#ifndef PATH_MAX
./python2.7/osdefs.h:#define PATH_MAX MAXPATHLEN
./python2.7/osdefs.h:#if defined(PATH_MAX) && PATH_MAX > 1024
./python2.7/osdefs.h:#define MAXPATHLEN PATH_MAX
./linux/limits.h:#define PATH_MAX        4096   /* # chars in a path name including nul */
./linux/btrfs.h:#define BTRFS_INO_LOOKUP_PATH_MAX 4080
./linux/un.h:#define UNIX_PATH_MAX  108

L'en-tête /linux/limits.h a le plus grand nombre et devrait être le plus authentique à inclure. Une autre stratégie consiste à définir la vôtre avec un nom différent, par exemple PATHLEN (4080 est suffisamment long pour la plupart des situations pratiques). L'essentiel est d'apprendre à utiliser find pour chercher des réponses à vos questions.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X