Где находится PATH_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?

Ответ 1

Его в 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)

Ответ 2

Помните, что пока неясно, определяет ли PATH_MAX максимальную длину с или без конечного нулевого байта. Это может быть одно или другое в разных операционных системах. Если вы не можете или не хотите проверять, в каком случае он находится во время компиляции, безопаснее форсировать искусственный предел PATH_MAX - 1. Береженого Бог бережет. (Очевидно, вам все равно нужно зарезервировать не менее PATH_MAX байт памяти для буферизации строки.)

Ответ 3

Это хороший вопрос. Я занимаюсь простым программированием на С и сталкивался с этой проблемой. В вашем конкретном Linux/Unix, в каталог /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 имеет наибольшее определенное число. Я действительно беспокоюсь о переносимости этого файла. Чтобы быть в безопасности, вы могли бы просто определить этот MACRO самостоятельно с другим именем, например PATHLEN (4080 достаточно для большинства практических ситуаций). Если это для большого пакета программного обеспечения, у вас также есть контроль. Это мое мнение.