Де визначено PATH_MAX у Linux?


112

Який файл заголовка я повинен викликати, #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 є цілим?


3
Дивіться це запитання: stackoverflow.com/questions/833291/…
Джош Браун

18
Ви, мабуть, хочете char current_path[PATH_MAX];замість цього char *current_path[PATH_MAX];- вам потрібен рядок, а не масив покажчиків.
Джон Картер

Відповіді:


134

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


23
Ось хороший посилання про PATH_MAX ... і чому це просто не так : insanecoding.blogspot.com/2007/11/pathmax-simply-isnt.html
paulsm4

Зачекайте ... чи це означає, що PATH_MAX є специфічним для Linux і не є частиною будь-якого стандарту?
Едвард Фолк

6
Ви, ймовірно, повинні використовувати <limit.h>; <linux / limit.h> виглядає виразно не портативно.
Едвард Фолк

4
Остерігайтеся: PATH_MAX відрізняється від NAME_MAX (а стаття x-ref'd частково, мабуть, плутає ці два, принаймні частково). Примітка: POSIX <limits.h>говорить: Визначення однієї з символічних констант у наступному списку опускається із <limits.h>заголовка […], де відповідне значення дорівнює або перевищує вказаний мінімум, але де значення може змінюватися залежно від файлу до якого воно застосовується. Фактичне значення, яке підтримується для конкретного імені шляху, надається функцією pathconf ().
Джонатан Леффлер

1
Імена підлоги дуже злі, небезпечні, а path_max - брехня і навіть не константа (це може бути різним для різних функцій ОС). Це жахлива особливість, і його слід замінити якнайшвидше.
Лотар

13

Будьте в курсі, що досі незрозуміло, чи PATH_MAXвизначає максимальну довжину з або без кінцевого нульового байта. Це може бути те чи інше в різних операційних системах. Якщо ви не можете або не хочете перевіряти, у якому випадку це під час компіляції, безпечніше застосовувати штучну межу PATH_MAX - 1. Краще перестрахуватися, ніж потім шкодувати. (Очевидно, що вам потрібно залишити принаймні PATH_MAXбайти пам'яті для буферизації рядка.)


4
> {PATH_MAX}Максимальна кількість байтів у імені шляху, включаючи закінчуючий нульовий символ. З POSIX '01.
muh karma

8
Зауважте, що POSIX 2008 вирішив плутанину - <limits.h>(Обгрунтування): {PATH_MAX} Інтерпретація IEEE PASC 1003.1 # 15 вирішила невідповідність стандарту визначенню імені шляху та опису {PATH_MAX}, що дозволило розробникам додатків виділяти {PATH_MAX} або {PATH_MAX} +1 байт. Невідповідність була видалена виправленням до визначення {PATH_MAX}, щоб включити нульовий символ. З цією зміною програми, які раніше виділяли {PATH_MAX} байт, продовжуватимуть успіх.
Джонатан Леффлер

1
Зауважте також, що використовувати не слід PATH_MAX - 1, але PATH_MAX + 1. Вам більше не доведеться, але ви хочете додати один байт для '\0'.
Алексіс Вілке

1
PATH_MAX - це те, чому люди думають, що Windows смокче, а насправді PATH_MAX смоктає лише програміст. PATH_MAX дійсно принаймні 32k у Windows, і ви насправді майже ніколи не бажаєте оголошувати PATH_MAX рівним 32k.
Лотар

7

Портативний спосіб зробити це:

#define _POSIX_C_SOURCE 1
#include <limits.h>

Spec: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/limits.h.html


І навіть цього недостатньо. PATH_MAXне повинно бути визначено: "Визначення однієї з символічних констант у наступному списку опускається із <limits.h>заголовка щодо конкретних реалізацій, де відповідне значення дорівнює або перевищує заявлене мінімум, але де значення може змінюватися залежно у файлі, до якого він застосований. Фактичне значення, яке підтримується для конкретного імені шляху, надається pathconf()функцією. " Враховуючи, що файлові системи Linux підтримують різні значення, мабуть, це порушення стандарту POSIX для визначення Linux PATH_MAX.
Ендрю Генле

1

Роблячи просте програмування на С, я зіткнувся з тим же завданням. У вашій конкретній системі Linux / usr / include каталог містить багато, тут файлів заголовків, характерних для ОС Linux.

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 достатньо довгий для більшості практичних ситуацій). Головний мій момент - навчитися використовувати пошук, щоб шукати відповіді на своє запитання.


0

PATH_MAX - це системний ліміт. Існує три категорії щодо системних обмежень, що існують у середовищі POSIX. Однією з цих категорій є змінні значення Pathname . Системні обмеження, які залежать від файлової системи, належать до цієї категорії. PATHMAX також є значенням змінної назви шляху. (тож це значення може змінюватися від файлової системи до файлової системи.) Отже, обмеження PATHNAME можна отримати за допомогою POSIX функцій pathconf () / fpathconf () . Цей спосіб є портативним способом отримання межі PATHNAME спеціальної файлової системи. Приклад коду, як показано нижче:

long
get_pathmax(void)
{
  long pathmax = -1;

  errno = 0;
  pathmax = pathconf("/", _PC_PATH_MAX);
  if (-1 == pathmax)
  {
    if (0 == errno)
    {
#define PATHMAX_INFINITE_GUESS 4096
      pathmax = PATHMAX_INFINITE_GUESS;
    }
    else
    {
      fprintf (stderr, "pathconf() FAILED, %d, %s\n", errno, strerror(errno));
    }
  }

  return pathmax;
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.