meaning berserk c linux gcc include clang

c - berserk - ¿Dónde se define PATH_MAX en Linux?



clang vs gcc (3)

Está 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 tiene algunos defectos como se menciona en este blog (gracias paulsm4)

¿Qué archivo de encabezado debo invocar con #include para poder usar PATH_MAX como int para dimensionar una cadena?

Quiero poder declarar:

char *current_path[PATH_MAX];

Pero cuando lo hago, mi compilador (Clang / LLVM en Linux) emite el siguiente error:

recursive_find6.c:29:20: error: use of undeclared identifier ''PATH_MAX'' char *current_path[PATH_MAX]; ^

Intenté hacer una búsqueda en Google, pero todavía no tuve suerte.

#include <limits.h> NO soluciona el problema / error.

¿También estoy en lo correcto al decir que el valor de PATH_MAX es un int?


Esta es una buena pregunta. Estoy haciendo una programación simple de C y encontré este problema. En su directorio particular de Linux / Unix, a / usr / include, aquí están todos los archivos de encabezado para su sistema.

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

Debería ver varios encabezados que definen PATH_MAX. Y puede ver que este valor se define de manera diferente en diferentes lugares. Aquí hay una lista de mi Ubuntu (también eliminé manualmente algunos hits positivos falsos del programa 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

Parece que /linux/limits.h tiene el número definido más grande. Me preocupa la portabilidad de este archivo. Para estar seguro, simplemente podría definir este MACRO con un nombre diferente, por ejemplo PATHLEN (4080 es lo suficientemente largo para la mayoría de las situaciones prácticas). Si esto es para un paquete de software grande, también tiene el control. Esta es mi opinión.


Tenga en cuenta que todavía no está claro si PATH_MAX define una longitud máxima con o sin un byte nulo final. Puede ser uno o el otro en diferentes sistemas operativos. Si no puede o no quiere verificar qué caso es durante la compilación, es más seguro forzar el límite artificial de PATH_MAX - 1 . Más vale prevenir que curar. (Obviamente, aún necesita reservar al menos PATH_MAX bytes de memoria para almacenar la cadena).