Który plik nagłówkowy powinienem wywołać, #include
aby móc używać PATH_MAX jako int do określania rozmiaru ciągu?
Chcę móc zadeklarować:
char *current_path[PATH_MAX];
Ale kiedy to robię, mój kompilator (Clang / LLVM w systemie Linux) wyświetla następujący błąd:
recursive_find6.c:29:20: error: use of undeclared identifier 'PATH_MAX'
char *current_path[PATH_MAX];
^
Próbowałem przeprowadzić wyszukiwanie w Google, ale nadal bez powodzenia.
#include <limits.h>
NIE rozwiązuje problemu / błędu.
Czy mam również rację, że wartość PATH_MAX to int?
char current_path[PATH_MAX];
zamiastchar *current_path[PATH_MAX];
- potrzebujesz łańcucha zamiast tablicy wskaźników.Odpowiedzi:
Jest w
linux/limits.h
.#define PATH_MAX 4096 /* # chars in a path name including nul */
PATH_MAX
ma pewne wady, jak wspomniano na tym blogu (dzięki paulsm4)źródło
<limits.h>
mówi: Definicja jednej ze stałych symbolicznych na poniższej liście powinna zostać pominięta w<limits.h>
nagłówku […], gdzie odpowiadająca jej wartość jest równa lub większa niż podane minimum, ale gdzie wartość może się zmieniać w zależności od pliku do którego jest stosowany. Rzeczywista wartość obsługiwana dla określonej nazwy ścieżki powinna być dostarczona przez funkcję pathconf ().Należy pamiętać, że nadal nie jest jasne, czy
PATH_MAX
definiuje maksymalną długość z końcowym bajtem zerowym czy bez niego. Może to być jeden lub drugi w różnych systemach operacyjnych. Jeśli nie możesz lub nie chcesz sprawdzić, jaki to przypadek podczas kompilacji, bezpieczniej jest wymusić sztuczne ograniczeniePATH_MAX - 1
. Lepiej dmuchać na zimne. (Oczywiście nadal musisz zarezerwować co najmniejPATH_MAX
bajty pamięci, aby buforować ciąg).źródło
{PATH_MAX}
Maksymalna liczba bajtów w nazwie ścieżki, w tym kończący znak null. Z POSIX '01.<limits.h>
problem - (Uzasadnienie): {PATH_MAX} IEEE PASC Interpretation 1003.1 # 15 rozwiązał niespójność w standardzie z definicją ścieżki i opisem {PATH_MAX}, umożliwiając twórcom aplikacji przydzielenie {PATH_MAX} lub {PATH_MAX} +1 bajtów. Niespójność została usunięta przez poprawienie definicji {PATH_MAX} w celu uwzględnienia znaku pustego. Dzięki tej zmianie aplikacje, które wcześniej przydzieliły {PATH_MAX} bajtów, będą nadal działać pomyślnie.PATH_MAX - 1
, alePATH_MAX + 1
. Nie musisz już tego robić, ale chcesz dodać jeden bajt do pliku'\0'
.Przenośny sposób to:
Specyfikacja: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/limits.h.html
źródło
PATH_MAX
nie musi być definiowane: „Definicja jednej ze stałych symbolicznych na poniższej liście powinna być pomijana w<limits.h>
nagłówku w określonych implementacjach, w których odpowiadająca jej wartość jest równa lub większa niż określone minimum, ale gdzie wartość może się różnić w zależności od na pliku, do którego jest stosowany. Rzeczywista wartość obsługiwana dla określonej ścieżki dostępu powinna być dostarczona przezpathconf()
funkcję. " Biorąc pod uwagę, że systemy plików Linuksa obsługują różne wartości, zdefiniowanie tego prawdopodobnie stanowi naruszenie standardu POSIX dla LinuksaPATH_MAX
.Podczas prostego programowania w C napotkałem to samo wyzwanie. W twoim konkretnym systemie Linux katalog / usr / include zawiera wiele, tutaj plików nagłówkowych specyficznych dla systemu operacyjnego Linux.
Powinieneś zobaczyć kilka nagłówków definiujących PATH_MAX; niestety ta wartość została zdefiniowana inaczej w różnych nagłówkach. Oto lista z mojego Ubuntu (ręcznie usunąłem również niektóre fałszywie pozytywne trafienia z programu grep).
Nagłówek /linux/limits.h miał największą liczbę i powinien być najbardziej autentyczny do uwzględnienia. Alternatywną strategią jest zdefiniowanie własnej nazwy pod inną nazwą, powiedzmy PATHLEN (4080 to wystarczająco dużo czasu na większość praktycznych sytuacji). Moim głównym celem jest nauczenie się używania funkcji znajdowania, aby szukać odpowiedzi na swoje pytanie.
źródło
PATH_MAX to ograniczenie systemowe. Istnieją trzy kategorie ograniczeń systemowych w środowisku POSIX. Jedną z tych kategorii są wartości zmiennych nazw ścieżek . Do tej kategorii należą ograniczenia systemowe, które zależą od systemu plików. PATHMAX jest również wartością zmiennej ścieżki. (więc ta wartość może się zmieniać z systemu plików na system plików). Tak więc limit PATHNAME można uzyskać za pomocą funkcji POSIX pathconf () / fpathconf () . Jest to przenośny sposób na uzyskanie limitu PATHNAME dla konkretnego systemu plików. Przykładowy kod jest taki jak poniżej:
źródło