Wo ist PATH_MAX in Linux definiert?

Lesezeit: 7 Minuten

Benutzeravatar von haziz
Haziz

Mit welcher Header-Datei soll ich aufrufen? #include um PATH_MAX als Int zur Größenanpassung einer Zeichenfolge verwenden zu können?

Ich möchte erklären können:

char *current_path[PATH_MAX];

Aber wenn ich das tue, gibt mein Compiler (Clang/LLVM unter Linux) den folgenden Fehler aus:

recursive_find6.c:29:20: error: use of undeclared identifier 'PATH_MAX'
char *current_path[PATH_MAX];
                   ^

Ich habe versucht, eine Google-Suche durchzuführen, aber immer noch kein Glück.

#include <limits.h> Behebt das Problem/den Fehler NICHT.

Bin ich auch richtig, dass der Wert von PATH_MAX ein Int ist?

  • Bitte sehen Sie sich diese Frage an: stackoverflow.com/questions/833291/…

    – Josh Brown

    25. Februar 2012 um 23:56 Uhr


  • Du willst wahrscheinlich char current_path[PATH_MAX]; Anstatt von char *current_path[PATH_MAX]; – Sie möchten eher eine Zeichenfolge als ein Array von Zeigern.

    – John Carter

    25. Februar 2012 um 23:57 Uhr

  • oder dieses hier stackoverflow.com/questions/4267390/…

    – qdii

    25. Februar 2012 um 23:59 Uhr

Benutzeravatar von Shiplu Mokaddim
Shiplu Mokadim

Es ist in 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 hat einige Mängel, wie in erwähnt dieses Blog (danke paulsm4)

  • Hier ist ein guter Link über PATH_MAX … und warum es einfach ist ist nicht: insanecoding.blogspot.com/2007/11/pathmax-simply-isnt.html

    – paulsm4

    26. Februar 2012 um 0:13 Uhr


  • Warten Sie … bedeutet das, dass PATH_MAX linuxspezifisch und nicht Teil eines Standards ist?

    – Eduard Falk

    15. Juni 2016 um 16:45 Uhr

  • Sie sollten wahrscheinlich verwenden; sieht eindeutig nicht-portabel aus.

    – Eduard Falk

    15. Juni 2016 um 16:51 Uhr

  • Achtung: PATH_MAX unterscheidet sich von NAME_MAX (und der x-referenzierte Artikel scheint diese beiden teilweise zu verwechseln, zumindest teilweise). Hinweis: POSIX <limits.h> sagt: Auf eine Definition einer der symbolischen Konstanten in der folgenden Liste soll verzichtet werden <limits.h> Header […] wobei der entsprechende Wert gleich oder größer als das angegebene Minimum ist, wobei der Wert jedoch je nach Datei, auf die er angewendet wird, variieren kann. Der tatsächliche Wert, der für einen bestimmten Pfadnamen unterstützt wird, soll von der Funktion pathconf() bereitgestellt werden.

    – Jonathan Leffler

    9. August 2016 um 4:07 Uhr

  • Pfadnamen sind sehr böse, unsicher und path_max ist eine Lüge und nicht einmal eine Konstante (es kann bei verschiedenen Betriebssystemfunktionen unterschiedlich sein). Es ist ein schreckliches Feature und sollte so schnell wie möglich ersetzt werden.

    – Lothar

    22. Dezember 2017 um 19:21 Uhr

Benutzeravatar von Kumashiro
Kumashiro

Beachten Sie, dass noch unklar ist, ob PATH_MAX definiert eine maximale Länge mit oder ohne abschließendem Null-Byte. Es kann das eine oder andere auf verschiedenen Betriebssystemen sein. Wenn Sie während der Kompilierung nicht prüfen können, um welche Groß-/Kleinschreibung es sich handelt, ist es sicherer, eine künstliche Begrenzung zu erzwingen PATH_MAX - 1. Sicher ist sicher. (Natürlich müssen Sie noch mindestens reservieren PATH_MAX Byte Speicher zum Puffern der Zeichenfolge.)

  • > {PATH_MAX} Maximale Anzahl von Bytes in einem Pfadnamen, einschließlich des abschließenden Nullzeichens. Ab POSIX ’01.

    – Muh Karma

    20. März 2014 um 16:51 Uhr


  • Beachten Sie, dass POSIX 2008 die Verwirrung beseitigt hat — <limits.h> (Begründung): {PATH_MAX} IEEE PASC Interpretation 1003.1 #15 befasste sich mit der Inkonsistenz im Standard mit der Definition des Pfadnamens und der Beschreibung von {PATH_MAX}, wodurch Anwendungsentwickler entweder {PATH_MAX} oder {PATH_MAX}+1 Bytes zuweisen konnten. Die Inkonsistenz wurde durch Korrektur der {PATH_MAX}-Definition beseitigt, um das Nullzeichen aufzunehmen. Mit dieser Änderung werden Anwendungen, die zuvor {PATH_MAX} Bytes zugewiesen haben, weiterhin erfolgreich sein.

    – Jonathan Leffler

    9. August 2016 um 4:09 Uhr


  • Beachten Sie auch, dass Sie nicht verwenden sollten PATH_MAX - 1aber PATH_MAX + 1. Sie müssen nicht mehr, aber Sie möchten ein Byte für die hinzufügen '\0'.

    – Alexis Wilke

    13. September 2016 um 23:27 Uhr

Benutzeravatar von emersion
Auftauchen

Der tragbare Weg, dies zu tun, ist:

#define _POSIX_C_SOURCE 1
#include <limits.h>

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

  • Und selbst das reicht nicht. PATH_MAX muss nicht definiert werden: “Eine Definition einer der symbolischen Konstanten in der folgenden Liste entfallen von dem <limits.h> Header bei bestimmten Implementierungen, bei denen der entsprechende Wert gleich oder größer als das angegebene Minimum ist, der Wert jedoch je nach Datei, auf die er angewendet wird, variieren kann. Der tatsächliche Wert, der für einen bestimmten Pfadnamen unterstützt wird, wird von bereitgestellt pathconf() function.” Da Linux-Dateisysteme unterschiedliche Werte unterstützen, ist es wahrscheinlich eine Verletzung des POSIX-Standards für Linux, dies zu definieren PATH_MAX.

    – Andreas Henle

    4. Februar 2020 um 13:55 Uhr


  • Was bedeutet definieren _POSIX_C_SOURCE tun? Mir wurde gesagt, dass man sollte noch nie Definieren Sie eine Variable, die mit a beginnt _ im eigenen Programm.

    – vy32

    7. Mai 2021 um 11:34 Uhr

  • @vy32 _POSIX_C_SOURCE ist ein Feature-Test-Makro.

    – Fluss

    2. Dezember 2021 um 13:22 Uhr

  • @flux – Okay … also sollte ich es nicht definieren?

    – vy32

    2. Dezember 2021 um 18:56 Uhr

  • @vy32 Es hängt davon ab, was Sie tun möchten. Bitte informieren Sie sich über Feature-Test-Makros.

    – Fluss

    3. Dezember 2021 um 10:08 Uhr

Benutzeravatar von Kemin Zhou
Kemin Zhou

Bei der einfachen C-Programmierung bin ich auf die gleiche Herausforderung gestoßen. Auf Ihrem speziellen Linux-System enthält das Verzeichnis /usr/include viele , hier Header-Dateien, die für ein Linux-Betriebssystem spezifisch sind.

find . -name "*.h" | xargs grep PATH_MAX 

Sie sollten mehrere Header sehen, die PATH_MAX definieren; leider wurde dieser Wert in verschiedenen Headern unterschiedlich definiert. Hier ist eine Auflistung von meinem Ubuntu (ich habe auch manuell einige falsch positive Treffer aus dem grep-Programm entfernt).

./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

Der Header /linux/limits.h hatte die größte Zahl und sollte am authentischsten enthalten sein. Eine alternative Strategie besteht darin, Ihren eigenen Namen mit einem anderen Namen zu definieren, z. B. PATHLEN (4080 ist lang genug für die meisten praktischen Situationen). Mein Hauptpunkt ist, zu lernen, find zu verwenden, um nach Antworten auf Ihre Frage zu suchen.

Benutzeravatar von user3104363
Benutzer3104363

PATH_MAX ist eine Systemgrenze. In der POSIX-Umgebung gibt es drei Kategorien von Systemgrenzen. Eine dieser Kategorien ist Pfadname-Variablenwerte. Systemgrenzen, die vom Dateisystem abhängen, fallen in diese Kategorie. PATHMAX ist auch der Pfadname-Variablenwert. (Dieser Wert kann sich also von Dateisystem zu Dateisystem ändern.) Daher kann das PATHNAME-Limit erreicht werden pathconf()/fpathconf() POSIX-Funktionen. Auf diese Weise können Sie das PATHNAME-Limit eines bestimmten Dateisystems portieren. Beispielcode ist wie folgt:

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;
}

  • Interessant zu sehen, was pathconf(“\\\\?\\c$”,_PC_PATH_MAX) unter Windows zurückgibt. (Dateinamen, die mit „\\?\“ in Windows beginnen, können bis zu 32 KB lang sein. Aus offensichtlichen Gründen nie ein beliebtes Feature und auch für Windows UNC-Dateinamen völlig unbrauchbar).

    – Robin Davis

    30. August 2021 um 5:45 Uhr


  • Interessant zu sehen, was pathconf(“\\\\?\\c$”,_PC_PATH_MAX) unter Windows zurückgibt. (Dateinamen, die mit „\\?\“ in Windows beginnen, können bis zu 32 KB lang sein. Aus offensichtlichen Gründen nie ein beliebtes Feature und auch für Windows UNC-Dateinamen völlig unbrauchbar).

    – Robin Davis

    30. August 2021 um 5:45 Uhr


1423550cookie-checkWo ist PATH_MAX in Linux definiert?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy