Где путь MAX определен в Linux?
какой файл заголовка я должен вызвать с помощью #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?
3 ответов
его в 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
имеет некоторые недостатки, как говорится в этот блог (спасибо paulsm4)
имейте в виду, что все еще неясно, если PATH_MAX
определяет максимальную длину с конечным нулевым байтом или без него. Это может быть одно или другое в разных операционных системах. Если вы не можете или не хотите проверять, в каком случае это происходит во время компиляции, безопаснее заставить искусственный предел PATH_MAX - 1
. Лучше перебдеть, чем недобдеть. (Очевидно, что вам все равно нужно зарезервировать хотя бы PATH_MAX
байты памяти для буферизации строки.)
Это хороший вопрос. Я занимаюсь простым программированием на C и столкнулся с этой проблемой. В вашем конкретном каталоге Linux/Unix, to /usr/include, вот все файлы заголовков для вашей системы.
find . -name "*.h" | xargs grep PATH_MAX
вы должны увидеть несколько заголовков, определяющих PATH_MAX. И вы можете видеть, что это значение определяется по-разному в разных местах. Вот список из моего Ubuntu (я также вручную удалил некоторые ложные положительные хиты из 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
выглядит как / linux / limits.h имеет наибольшее определенное число. Я беспокоюсь о переносимости этого файла. Поэтому для безопасности вы можете просто определить этот макрос самостоятельно с другим именем, скажем PATHLEN (4080 достаточно долго для большинства практических ситуаций). Если это для большого пакета программного обеспечения, у вас также есть контроль. Это мое мнение.