web-dev-qa-db-ger.com

Wo ist PATH_MAX in Linux definiert?

Welche Header-Datei sollte ich mit #include Aufrufen, um PATH_MAX als Int für die Größe eines Strings verwenden zu können?

Ich möchte erklären können:

char *current_path[PATH_MAX];

Dabei 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 NICHT das Problem/den Fehler.

Stimmt es auch, dass der Wert von PATH_MAX ein Int ist?

98
haziz

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 diesem Blog erwähnt (danke paulsm4)

124
Shiplu Mokaddim

Beachten Sie, dass es immer noch unklar ist, ob PATH_MAX Eine maximale Länge mit oder ohne nachfolgendem Nullbyte definiert. Dies kann auf verschiedenen Betriebssystemen der Fall sein. Wenn Sie nicht überprüfen können oder möchten, welcher Fall beim Kompilieren vorliegt, ist es sicherer, ein künstliches Limit von PATH_MAX - 1 Zu erzwingen. Sicher ist sicher. (Natürlich müssen Sie immer noch mindestens PATH_MAX Byte Speicher reservieren, um die Zeichenfolge zu puffern.)

12
Kumashiro

Das ist eine gute Frage. Ich mache einige einfache C-Programmierung und stieß auf dieses Problem. In Ihrem speziellen Linux/Unix-Verzeichnis bis/usr/include finden Sie hier alle Header-Dateien für Ihr System.

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

Sie sollten mehrere Header sehen, die PATH_MAX definieren. Und Sie können sehen, dass dieser Wert an verschiedenen Stellen unterschiedlich definiert ist. Hier ist eine Auflistung von meinem Ubuntu (ich habe auch einige falsch positive Treffer manuell 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

Sieht so aus, als hätte /linux/limits.h die größte definierte Anzahl. Ich mache mir Sorgen um die Portabilität dieser Datei. Aus Sicherheitsgründen können Sie dieses MAKRO einfach selbst mit einem anderen Namen definieren, z. B. PATHLEN (4080 ist für die meisten praktischen Situationen ausreichend lang). Wenn es sich um ein großes Softwarepaket handelt, haben Sie auch die Kontrolle. Das ist meine Meinung.

2
Kemin Zhou

Der tragbare Weg, dies zu tun, ist:

#define _POSIX_C_SOURCE 1
#include <limits.h>
0
emersion