GLOB(3) | Podręcznik programisty Linuksa | GLOB(3) |
glob, globfree - znalezienie ścieżek odpowiadających wzorcowi, zwolnienie pamięć z glob()
#include <glob.h>
int glob(const char *pattern, int flags, int (*errfunc) (const char *epath, int eerrno), glob_t *pglob); void globfree(glob_t *pglob);
Funkcja glob() przeszukuje wszystkie ścieżki odpowiadające wzorcowi pattern, stosując przy tym reguły takie, jakich użyłaby powłoka (zobacz glob(7)). Nie jest dokonywane rozwinięcie tyldy ani podstawienie parametrów. Jeśli są one potrzebne, to należy użyć wordexp(3).
Funkcja globfree() zwalnia obszar pamięci zaalokowany dynamicznie przez wcześniejsze wywołanie funkcji glob().
W wyniku wywołania glob() tworzona jest struktura, na którą wskazuje pglob. Struktura jest typu glob_t (deklarowany w <glob.h>) i zawiera następujące elementy zdefiniowane przez POSIX.2 (mogą też występować dodatkowe jako rozszerzenie):
typedef struct {
size_t gl_pathc; /* Liczba odpowiadających dotąd ścieżek. */
char **gl_pathv; /* Lista odpowiadających ścieżek */
size_t gl_offs; /* Sloty do rezerwowania w gl_pathv. */ } glob_t;
Wyniki są zachowywane w dynamicznie przydzielanym obszarze pamięci.
Argument flags jest bitowym OR-em zera lub więcej następujących symboli stałych modyfikujących zachowanie glob():
Parametr flags może również zawierać następujące znaczniki, będące rozszerzeniami GNU niedefiniowanymi przez POSIX.2:
Jeśli errfunc nie jest równe NULL, to w wypadku błędu będzie ono wywołane z argumentami epath, czyli wskaźnikiem do ścieżki, na której coś się nie powiodło, i z eerrno, przechowującym wartość errno, zwróconą przez wywołanie do opendir(3), readdir(3) lub stat(2). Jeśli errfunc zwraca wartość niezerową lub jeśli ustawiony jest znacznik GLOB_ERR, to glob() zakończy działanie po wywołaniu funkcji errfunc.
Po pomyślnym zakończeniu, pglob->gl_pathc zawiera liczbę pasujących ścieżek, a pglob->gl_pathv wskaźnik do listy wskaźników do dopasowanych ścieżek. Lista ta jest zakończona wskaźnikiem null.
Możliwe jest wywoływanie glob() wielokrotnie. W takim wypadku należy w następnych wywołaniach ustawić w flags znacznik GLOB_APPEND.
Jako rozszerzenie GNU, pglob->gl_flags jest ustawiane jako or podanych znaczników i GLOB_MAGCHAR, gdy występują metaznaki.
Po pomyślnym zakończeniu glob() zwraca zero. Inne możliwe wartości to:
Informacje o pojęciach używanych w tym rozdziale można znaleźć w podręczniku attributes(7).
Interfejs | Atrybut | Wartość |
glob() | Bezpieczeństwo wątkowe | MT-Unsafe race:utent env sig:ALRM timer locale |
globfree() | Bezpieczeństwo wątkowe | MT-Safe |
W powyższej tabeli utent w race:utent oznacza, że jeśli któraś z funkcji setutent(3), getutent(3) lub endutent(3) jest używana równolegle w różnych wątkach programu, może nastąpić sytuacja wyścigu danych. Ponieważ glob() wywołuje te funkcje, stąd dla przypomnienia użytkownikom używamy race:utent.
POSIX.1-2001, POSIX.1-2008, POSIX.2.
Elementy gl_pathc i gl_offs struktury są w glibc 2.1 zadeklarowane jako size_t, jak powinno być zgodnie z POSIX.2, ale są zadeklarowane jako int w glibc 2.0.
Funkcja glob() może zawieść z powodu błędu wywołanych przez nią funkcji, takich jak malloc(3) czy opendir(3). Wywołania te zapiszą kod błędu w errno.
Jednym z przykładów użycia jest następujący kod, emulujący wpisanie
ls -l *.c ../*.c
w powłoce:
glob_t globbuf; globbuf.gl_offs = 2; glob("*.c", GLOB_DOOFFS, NULL, &globbuf); glob("../*.c", GLOB_DOOFFS | GLOB_APPEND, NULL, &globbuf); globbuf.gl_pathv[0] = "ls"; globbuf.gl_pathv[1] = "-l"; execvp("ls", &globbuf.gl_pathv[0]);
ls(1), sh(1), stat(2), exec(3), fnmatch(3), malloc(3), opendir(3), readdir(3), wordexp(3), glob(7)
Angielska wersja tej strony pochodzi z wydania 5.10 projektu Linux man-pages. Opis projektu, informacje dotyczące zgłaszania błędów oraz najnowszą wersję oryginału można znaleźć pod adresem https://www.kernel.org/doc/man-pages/.
Autorami polskiego tłumaczenia niniejszej strony podręcznika są: Przemek Borys <pborys@dione.ids.pl>, Andrzej Krzysztofowicz <ankry@green.mf.pg.gda.pl>, Robert Luberda <robert@debian.org> i Michał Kułach <michal.kulach@gmail.com>
Niniejsze tłumaczenie jest wolną dokumentacją. Bliższe informacje o warunkach licencji można uzyskać zapoznając się z GNU General Public License w wersji 3 lub nowszej. Nie przyjmuje się ŻADNEJ ODPOWIEDZIALNOŚCI.
Błędy w tłumaczeniu strony podręcznika prosimy zgłaszać na adres manpages-pl-list@lists.sourceforge.net.
9 czerwca 2020 r. | GNU |