Какой файл заголовка следует вызвать, #include
чтобы иметь возможность использовать PATH_MAX в качестве int для определения размера строки?
Я хочу иметь возможность заявить:
char *current_path[PATH_MAX];
Но когда я это сделаю, мой компилятор (Clang / LLVM в Linux) выдает следующую ошибку:
recursive_find6.c:29:20: error: use of undeclared identifier 'PATH_MAX'
char *current_path[PATH_MAX];
^
Я попытался выполнить поиск в Google, но все равно не повезло.
#include <limits.h>
НЕ устраняет проблему / ошибку.
Правильно ли я, что значение PATH_MAX - это int?
char current_path[PATH_MAX];
вместоchar *current_path[PATH_MAX];
- вам нужна строка, а не массив указателей.Ответы:
Его в
linux/limits.h
.#define PATH_MAX 4096 /* # chars in a path name including nul */
PATH_MAX
имеет некоторые недостатки, упомянутые в этом блоге (спасибо paulsm4)источник
<limits.h>
говорит: Определение одной из символьных констант в следующем списке должно быть исключено из<limits.h>
заголовка […], где соответствующее значение равно или больше указанного минимума, но где значение может варьироваться в зависимости от файла к которому он применяется. Фактическое значение, поддерживаемое для конкретного пути, должно быть предоставлено функцией pathconf ().Имейте в виду, что до сих пор неясно,
PATH_MAX
определяется ли максимальная длина с завершающим нулевым байтом или без него. Это может быть одно или другое в разных операционных системах. Если вы не можете или не хотите проверять, какой это случай во время компиляции, безопаснее установить искусственное ограничениеPATH_MAX - 1
. Береженого Бог бережет. (Очевидно, вам все равно нужно зарезервировать как минимумPATH_MAX
байты памяти для буферизации строки.)источник
{PATH_MAX}
Максимальное количество байтов в имени пути, включая завершающий нулевой символ. Начиная с POSIX '01.<limits.h>
(Обоснование): {PATH_MAX} Интерпретация IEEE PASC 1003.1 # 15 устраняет несоответствие в стандарте с определением имени пути и описанием {PATH_MAX}, позволяя разработчикам приложений выделять либо {PATH_MAX}, либо {PATH_MAX} +1 байт. Несоответствие было устранено путем исправления определения {PATH_MAX} для включения нулевого символа. После этого изменения приложения, которым ранее было выделено {PATH_MAX} байтов, продолжат работу.PATH_MAX - 1
, ноPATH_MAX + 1
. Вам больше не нужно этого делать, но вы хотите добавить один байт для'\0'
.Портативный способ сделать это:
Спецификация: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/limits.h.html
источник
PATH_MAX
не нужно определять: «Определение одной из символических констант в следующем списке должно быть исключено из<limits.h>
заголовка в конкретных реализациях, где соответствующее значение равно или больше указанного минимума, но где значение может варьироваться в зависимости от в файле, к которому он применяется. Фактическое значение, поддерживаемое для конкретного пути, должно предоставлятьсяpathconf()
функцией ". Поскольку файловые системы Linux поддерживают разные значения, это, вероятно, является нарушением стандарта POSIX для LinuxPATH_MAX
.При выполнении простого программирования на C я столкнулся с той же проблемой. В вашей конкретной системе Linux каталог / usr / include содержит множество файлов заголовков, специфичных для ОС Linux.
Вы должны увидеть несколько заголовков, определяющих PATH_MAX; к сожалению, это значение определялось по-разному в разных заголовках. Вот список из моего Ubuntu (я также вручную удалил несколько ложных срабатываний из программы grep).
Заголовок /linux/limits.h имеет наибольший номер и должен быть наиболее аутентичным для включения. Альтернативная стратегия - определить свое собственное с другим именем, скажем PATHLEN (4080 достаточно длинный для большинства практических ситуаций). Моя главная цель - научиться использовать find для поиска ответов на ваш вопрос.
источник
PATH_MAX - системный предел. В среде POSIX существуют три категории системных ограничений. Одна из этих категорий - значения переменных имени пути . Системные ограничения, которые зависят от файловой системы, попадают в эту категорию. PATHMAX также является значением переменной имени пути. (поэтому это значение может изменяться от файловой системы к файловой.) Итак, ограничение PATHNAME может быть получено с помощью функций POSIX pathconf () / fpathconf () . Этот способ является переносимым способом получить ограничение PATHNAME для конкретной файловой системы. Пример кода приведен ниже:
источник