¿Con qué archivo de encabezado debo invocar #include
para poder usar PATH_MAX como un 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 cierto de que el valor de PATH_MAX es un int?
char current_path[PATH_MAX];
lugar dechar *current_path[PATH_MAX];
- desea una cadena en lugar de una matriz de punteros.Respuestas:
Está en
linux/limits.h
.#define PATH_MAX 4096 /* # chars in a path name including nul */
PATH_MAX
tiene algunos defectos como se menciona en este blog (gracias paulsm4)fuente
<limits.h>
dice: Se omitirá una definición de una de las constantes simbólicas en la siguiente lista del<limits.h>
encabezado […] donde el valor correspondiente es igual o mayor que el mínimo establecido, pero donde el valor puede variar dependiendo del archivo al que se aplica. El valor real admitido para un nombre de ruta específico será proporcionado por la función pathconf ().Tenga en cuenta que aún no está claro si
PATH_MAX
define una longitud máxima con o sin un byte nulo al final. Puede ser uno u otro en diferentes sistemas operativos. Si no puede o no quiere verificar qué caso es durante la compilación, es más seguro forzar un límite artificial dePATH_MAX - 1
. Más vale prevenir que lamentar. (Obviamente, aún necesita reservar al menosPATH_MAX
bytes de memoria para almacenar en búfer la cadena).fuente
{PATH_MAX}
Número máximo de bytes en un nombre de ruta, incluido el carácter nulo de terminación. Desde POSIX '01.<limits.h>
(Justificación): {PATH_MAX} IEEE PASC Interpretation 1003.1 # 15 abordó la inconsistencia en el estándar con la definición del nombre de ruta y la descripción de {PATH_MAX}, permitiendo a los desarrolladores de aplicaciones asignar {PATH_MAX} o {PATH_MAX} +1 bytes. La inconsistencia se ha eliminado mediante la corrección de la definición de {PATH_MAX} para incluir el carácter nulo. Con este cambio, las aplicaciones que previamente asignaron {PATH_MAX} bytes continuarán teniendo éxito.PATH_MAX - 1
, peroPATH_MAX + 1
. Ya no tiene que hacerlo, pero desea agregar un byte para'\0'
.La forma portátil de hacerlo es:
Especificación: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/limits.h.html
fuente
PATH_MAX
no tiene que ser definido: "Se omitirá una definición de una de las constantes simbólicas en la siguiente lista del<limits.h>
encabezado en implementaciones específicas donde el valor correspondiente es igual o mayor que el mínimo establecido, pero donde el valor puede variar dependiendo en el archivo al que se aplica. La función proporcionará el valor real admitido para un nombre de ruta específicopathconf()
". Dado que los sistemas de archivos de Linux admiten diferentes valores, probablemente sea una violación del estándar POSIX para Linux definirloPATH_MAX
.Al hacer programación simple en C, encontré el mismo desafío. En su sistema Linux particular, el directorio / usr / include contiene muchos, aquí archivos de encabezado específicos para un sistema operativo Linux.
Debería ver varios encabezados que definen PATH_MAX; desafortunadamente, este valor se definió de manera diferente en diferentes encabezados. Aquí hay una lista de mi Ubuntu (también eliminé manualmente algunos resultados falsos positivos del programa grep).
El encabezado /linux/limits.h tenía el número más grande y debería ser el más auténtico para incluir. Una estrategia alternativa es definir el suyo con un nombre diferente, digamos PATHLEN (4080 es lo suficientemente largo para la mayoría de situaciones prácticas). Mi punto principal es aprender a usar Find para buscar respuestas a su pregunta.
fuente
PATH_MAX es un límite del sistema. Hay tres categorías sobre los límites del sistema que existen en el entorno POSIX. Una de estas categorías son los valores de variable de nombre de ruta . Los límites del sistema que dependen del sistema de archivos entran en esta categoría. PATHMAX también es un valor de variable de nombre de ruta. (para que este valor pueda cambiar de un sistema de archivos a otro). Por lo tanto, el límite de PATHNAME se puede obtener con las funciones de POSIX pathconf () / fpathconf () . Esta es una forma portátil de obtener el límite de PATHNAME de un sistema de archivos específico. El código de ejemplo es el siguiente:
fuente