basename(3) Library Functions Manual basename(3) NAZWA basename, dirname - wydziela skladowe sciezki BIBLIOTEKA Standardowa biblioteka C (libc, -lc) SKLADNIA #include char *dirname(char *path); char *basename(char *path); OPIS Ostrzezenie: istnieja dwie rozne funkcje basename(); patrz nizej. Funkcje dirname() i basename() rozbijaja zakonczony znakiem null lancuch nazwy sciezki dostepu na skladowe: katalog i nazwe pliku. W typowym przypadku dirname() zwraca lancuch az do ostatniego znaku ,,/", ale z jego wylaczeniem, a basename() zwraca skladowa nastepujaca po ostatnim ,,/". Koncowe znaki ,,/" nie sa uwazane za czesc nazwy sciezki dostepu. Jesli path nie zawiera ukosnika, dirname() zwraca lancuch ,,.", podczas gdy basename() zwraca kopie path. Jesli path jest lancuchem ,,/", to zarowno dirname(), jak i basename() zwracaja lancuch ,,/". Jesli path jest wskaznikiem null lub wskazuje na pusty lancuch znakow, to zarowno dirname(), jak i basename() zwracaja lancuch ,,.". Polaczenie lancucha zwroconego przez dirname() z ,,/" i lancuchem zwroconym przez basename() daje pelna nazwe sciezki dostepu. Zarowno dirname(), jak i basename() moga zmienic zawartosc path, tak wiec moze byc potrzebne przekazanie kopii podczas wywolywania ktorejkolwiek z tych funkcji. Funkcje te moga zwrocic wskazniki do statycznie alokowanej pamieci, ktora moze zostac nadpisana przez kolejne wywolania. Alternatywnie moga zwrocic wskazniki do czesci path, tak ze lancuch znakow wskazywany przez path nie powinien byc ani zmieniany, ani usuwany az do momentu, w ktorym wskaznik zwrocony przez opisywane funkcje nie bedzie juz potrzebny. Ponizsza lista przykladow (wzieta z SUSv2) pokazuje lancuchy znakow zwracane przez dirname() i basename() dla roznych sciezek: sciezka dirname basename /usr/lib /usr lib /usr/ / usr usr . usr / / / . . . .. . .. WARTOSC ZWRACANA Zarowno dirname(), jak i basename() zwracaja wskazniki do zakonczonych znakiem null lancuchow znakow (nie nalezy tych wskaznikow przekazywac do free(3)). ATRYBUTY Informacje o pojeciach uzywanych w tym rozdziale mozna znalezc w podreczniku attributes(7). +---------------------------+--------------------------+---------------+ |Interfejs | Atrybut | Wartosc | +---------------------------+--------------------------+---------------+ |basename(), dirname() | Bezpieczenstwo watkowe | MT-bezpieczne | +---------------------------+--------------------------+---------------+ WERSJE Istnieja dwie rozne wersji funkcji basename(): wersja POSIX opisana powyzej oraz wersja GNU, ktora jest dostepna po #define _GNU_SOURCE /* Patrz feature_test_macros(7) */ #include Wersja GNU nigdy nie zmienia swojego argumentu oraz zwraca pusty lancuch znakow, jesli path konczy sie znakiem ukosnika, w szczegolnosci gdy path jest rowne "/". Nie istnieje wersja GNU funkcji dirname(). W bibliotece GNU wersja POSIX funkcji basename() jest uzywana, gdy dolaczony jest plik naglowkowy . W przeciwnym wypadku uzywana jest wersja GNU. STANDARDY POSIX.1-2008. HISTORIA POSIX.1-2001. USTERKI W implementacji biblioteki glibc POSIX-owych wersji tych funkcji modyfikuja argument path i powoduja blad naruszenia ochrony pamieci, jesli sa wywolane z statycznym lancuchem znakow takim jak ,,/usr/". Do glibc 2.2.1 dirname() niepoprawnie obslugiwalo nazwy sciezek dostepu z koncowymi znakami ,,/" i generowalo blad naruszenia ochrony pamieci, gdy podalo sie NULL jako argument. PRZYKLADY Nastepujacy przykladowy kod pokazuje uzycie funkcji basename() i dirname(): char *dirc, *basec, *bname, *dname; char *path = "/etc/passwd"; dirc = strdup(path); basec = strdup(path); dname = dirname(dirc); bname = basename(basec); printf("dirname=%s, basename=%s\n", dname, bname); ZOBACZ TAKZE basename(1), dirname(1) TLUMACZENIE Autorami polskiego tlumaczenia niniejszej strony podrecznika sa: Andrzej Krzysztofowicz , Robert Luberda i Michal Kulach Niniejsze tlumaczenie jest wolna dokumentacja. Blizsze informacje o warunkach licencji mozna uzyskac zapoznajac sie z GNU General Public License w wersji 3 lub nowszej. Nie przyjmuje sie ZADNEJ ODPOWIEDZIALNOSCI. Bledy w tlumaczeniu strony podrecznika prosimy zglaszac na adres listy dyskusyjnej . Linux man-pages 6.12 23 lipca 2024 r. basename(3)