web-dev-qa-db-fra.com

Où est défini PATH_MAX sous Linux?

Quel fichier d'en-tête dois-je appeler avec #include pour pouvoir utiliser PATH_MAX en tant qu'int pour dimensionner une chaîne?

Je veux pouvoir déclarer:

char *current_path[PATH_MAX];

Mais lorsque je le fais, mon compilateur (Clang/LLVM sur 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.

Suis-je également correct que la valeur de PATH_MAX est un int?

98
haziz

C'est dans 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 mentionnés dans ce blog (merci paulsm4)

124
Shiplu Mokaddim

Sachez qu'il n'est toujours pas clair si PATH_MAX définit une longueur maximale avec ou sans octet nul final. Ce peut être l'un ou l'autre sur différents systèmes d'exploitation. Si vous ne pouvez ou ne voulez pas vérifier le cas lors de la compilation, il est préférable de forcer la limite artificielle de PATH_MAX - 1. Mieux vaut prévenir que guérir. (Évidemment, vous devez toujours réserver au moins PATH_MAX _ octets de mémoire pour mettre la chaîne en mémoire tampon.)

12
Kumashiro

C'est une bonne question. Je fais de la programmation en C simple et ai rencontré ce problème. Sur votre Linux/Unix particulier, vers le répertoire/usr/include, voici tous les fichiers d’en-tête de votre système.

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

Vous devriez voir plusieurs en-têtes définissant 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 également supprimé manuellement certains résultats faussement 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

On dirait que /linux/limits.h a le plus grand nombre défini. Je suis préoccupé par la portabilité de ce fichier. Donc, pour être sûr, vous pouvez simplement définir vous-même cette MACRO avec un nom différent, par exemple, PATHLEN (4080 est assez long pour la plupart des situations pratiques). S'il s'agit d'un progiciel volumineux, vous avez également le contrôle. C'est mon opinion.

2
Kemin Zhou

La façon portable de le faire est:

#define _POSIX_C_SOURCE 1
#include <limits.h>
0
emersion