Mit welcher Header-Datei soll ich aufrufen #include
, 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];
Wenn ich dies 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.
Stimmt es auch, dass der Wert von PATH_MAX ein int ist?
char current_path[PATH_MAX];
stattchar *current_path[PATH_MAX];
- Sie möchten eher eine Zeichenfolge als ein Array von Zeigern.Antworten:
Es ist in
linux/limits.h
.#define PATH_MAX 4096 /* # chars in a path name including nul */
PATH_MAX
hat einige Mängel wie in diesem Blog erwähnt (danke paulsm4)quelle
<limits.h>
sagt: Eine Definition einer der symbolischen Konstanten in der folgenden Liste wird in der<limits.h>
Kopfzeile […] weggelassen, wenn der entsprechende Wert gleich oder größer als das angegebene Minimum ist, der Wert jedoch je nach Datei variieren kann auf die es angewendet wird. Der tatsächliche Wert, der für einen bestimmten Pfadnamen unterstützt wird, wird von der Funktion pathconf () bereitgestellt.Beachten Sie, dass es immer noch unklar ist, ob
PATH_MAX
eine maximale Länge mit oder ohne nachfolgendes Nullbyte definiert wird. Es kann das eine oder andere auf verschiedenen Betriebssystemen sein. Wenn Sie während der Kompilierung nicht überprüfen können oder wollen, welcher Fall vorliegt, ist es sicherer, eine künstliche Begrenzung von zu erzwingenPATH_MAX - 1
. Sicher ist sicher. (Natürlich müssen Sie immer noch mindestensPATH_MAX
Byte Speicher reservieren, um die Zeichenfolge zu puffern.)quelle
{PATH_MAX}
Maximale Anzahl von Bytes in einem Pfadnamen, einschließlich des abschließenden Nullzeichens. Von POSIX '01.<limits.h>
(Begründung): {PATH_MAX} IEEE PASC Interpretation 1003.1 # 15 hat die Inkonsistenz im Standard mit der Definition des Pfadnamens und der Beschreibung von {PATH_MAX} behoben und es Anwendungsentwicklern ermöglicht, entweder {PATH_MAX} oder zuzuweisen {PATH_MAX} +1 Bytes. Die Inkonsistenz wurde durch Korrektur der Definition {PATH_MAX} entfernt, um das Nullzeichen einzuschließen. Mit dieser Änderung sind Anwendungen, denen zuvor {PATH_MAX} Bytes zugewiesen wurden, weiterhin erfolgreich.PATH_MAX - 1
solltenPATH_MAX + 1
. Sie müssen nicht mehr, aber Sie möchten ein Byte für die hinzufügen'\0'
.Der tragbare Weg, dies zu tun, ist:
Spezifikation: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/limits.h.html
quelle
PATH_MAX
muss nicht definiert werden: "Eine Definition einer der symbolischen Konstanten in der folgenden Liste wird<limits.h>
bei bestimmten Implementierungen, bei denen der entsprechende Wert gleich oder größer als das angegebene Minimum ist, aber bei denen der Wert je nach dem Wert variieren kann, aus dem Header gestrichen in der Datei, auf die es angewendet wird. Der tatsächliche Wert, der für einen bestimmten Pfadnamen unterstützt wird, wird von derpathconf()
Funktion bereitgestellt . " Da Linux-Dateisysteme unterschiedliche Werte unterstützen, ist es wahrscheinlich eine Verletzung des POSIX-Standards, den Linux definiertPATH_MAX
.Bei der einfachen C-Programmierung stieß ich auf die gleiche Herausforderung. Auf Ihrem speziellen Linux-System enthält das Verzeichnis / usr / include viele Header-Dateien, die für ein Linux-Betriebssystem spezifisch sind.
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 einige falsch positive Treffer manuell aus dem grep-Programm entfernt).
Der Header /linux/limits.h hatte die größte Nummer und sollte die authentischste sein. Eine alternative Strategie besteht darin, Ihren eigenen Namen mit einem anderen Namen zu definieren, beispielsweise PATHLEN (4080 ist für die meisten praktischen Situationen lang genug). Mein Hauptpunkt ist zu lernen, wie man mit find nach Antworten auf Ihre Frage sucht.
quelle
PATH_MAX ist ein Systemlimit. In der POSIX-Umgebung gibt es drei Kategorien zu Systembeschränkungen. Eine dieser Kategorien sind Pfadnamenvariablenwerte . Systemgrenzen, die vom Dateisystem abhängen, fallen in diese Kategorie. PATHMAX ist auch der Wert der Pfadnamenvariablen. (Dieser Wert kann sich also von Dateisystem zu Dateisystem ändern.) Das PATHNAME-Limit kann also mit den POSIX-Funktionen pathconf () / fpathconf () ermittelt werden. Diese Methode ist eine tragbare Methode, um das PATHNAME-Limit für ein bestimmtes Dateisystem zu ermitteln. Beispielcode ist wie folgt:
quelle