stat

STAT(2)                 PodrÄcznik programisty Linuksa                 STAT(2)



NAZWA
       stat, fstat, lstat, fstatat - pobieranie stanu pliku

SKÅADNIA
       #include <sys/types.h>
       #include <sys/stat.h>
       #include <unistd.h>

       int stat(const char *pathname, struct stat *buf);
       int fstat(int fd, struct stat *buf);
       int lstat(const char *pathname, struct stat *buf);

       #include <fcntl.h>           /* Definicja staÅych AT_* */
       #include <sys/stat.h>

       int fstatat(int dirfd, const char *pathname, struct stat *buf,
                   int flags);

   Wymagane ustawienia makr biblioteki glibc (patrz feature_test_macros(7)):

       lstat():
           /* glibc 2.19 i wczeÅniejsze */ _BSD_SOURCE
               || /* Od glibc 2.20 */ _DEFAULT_SOURCE
               || _XOPEN_SOURCE >= 500
               || /* od glibc 2.10: */ _POSIX_C_SOURCE >= 200112L

       fstatat():
           Od glibc 2.10:
               _POSIX_C_SOURCE >= 200809L
           Przed glibc 2.10:
               _ATFILE_SOURCE

OPIS
       Funkcje te zwracajÄ informacje o podanym pliku w buforze wskazanym
       przez buf. Do uzyskania tej informacji nie sÄ wymagane prawa dostÄpu do
       samego pliku, lecz — w przypadku stat, fstatat() i lstat() — konieczne
       sÄ prawa wykonywania (przeszukiwania) do wszystkich katalogów na
       prowadzÄcej do pliku Åcieżce pathname.

       stat() i fstatat() pobierajÄ informacje o pliku wskazanym przez
       pathname; cechy wyróżniajÄce fstatat() opisano poniżej.

       lstat() jest identyczny z stat(), lecz w przypadku gdy pathname jest
       dowiÄzaniem symbolicznym, to zwraca informacje o samym dowiÄzaniu, a
       nie pliku, do którego siÄ to dowiÄzanie odwoÅuje.

       fstat() jest identyczny z stat(), z tym wyjÄtkiem, że plik o którym
       majÄ byÄ pobrane informacje, jest okreÅlony przez deskryptor pliku fd.

       Wszystkie te funkcje zwracajÄ strukturÄ stat, zawierajÄcÄ nastÄpujÄce
       pola:

           struct stat {
               dev_t     st_dev;      /* ID urzÄdzenia zawierajÄcego plik */
               ino_t     st_ino;      /* numer i-wÄzÅa (inode) */
               mode_t    st_mode;     /* tryb i typ pliku */
               nlink_t   st_nlink;    /* liczba dowiÄzaÅ staÅych (hardlinks) */
               uid_t     st_uid;      /* ID użytkownika wÅaÅciciela */
               gid_t     st_gid;      /* ID grupy wÅaÅciciela */
               dev_t     st_rdev;     /* ID urzÄdzenia (jeÅli plik specjalny) */
               off_t     st_size;     /* caÅkowity rozmiar w bajtach */
               blksize_t st_blksize;  /* wielkoÅÄ bloku dla I/O systemu plików */
               blkcnt_t  st_blocks;   /* liczba zaalokowanych bloków 512-bajtowych */

               /* Od Linuksa 2.6 jÄdro obsÅuguje nanosekundowÄ
                  rozdzielczoÅÄ nastÄpujÄcych pól znaczników czasu.
                  SzczegóÅy opisujÄce Linuksa w wersji starszej niż 2.6
                  znajdujÄ siÄ w rozdziale UWAGI */

               struct timespec st_atim;    /* czas ostatniego dostÄpu */
               struct timespec st_mtim;    /* czas ostatniej modyfikacji */
               struct timespec st_ctim;    /* czas ostatniej zmiany */
           };

           #define st_atime st_atim.tv_sec      /* KompatybilnoÅÄ wsteczna */
           #define st_mtime st_mtim.tv_sec
           #define st_ctime st_ctim.tv_sec
           };

       Uwaga: kolejnoÅÄ pól w strukturze stat różni siÄ nieco w zależnoÅci
       od architektury. Dodatkowo, powyższa definicja nie pokazuje bajtów
       wyrównujÄcych, które mogÄ byÄ obecne pomiÄdzy niektórymi polami na
       różnych architekturach. Z tymi detalami można siÄ zapoznaÄ
       analizujÄc glibc i kod źródÅowy jÄdra.

       Uwaga: Dla zachowania wydajnoÅci i prostoty, różne pola w strukturze
       stat mogÄ zawieraÄ stany z różnych momentów wykonywania wywoÅania
       systemowego. PrzykÅadowo, jeÅli st_mode lub st_uid zostanie zmieniony
       przez inny proces za pomocÄ wywoÅania chmod(2) lub chown(2), stat()
       może zwróciÄ stary st_mode razem z nowym st_uid albo stary st_uid
       razem z nowym st_mode.

       Pole st_dev opisuje urzÄdzenie, w którym plik siÄ znajduje. (Makra
       major(3) i minor(3) mogÄ siÄ przydaÄ przy dekodowaniu identyfikatora
       urzÄdzenia znajdujÄcego siÄ w tym polu).

       Pole st_rdev opisuje urzÄdzenie reprezentowane przez ten plik
       (i-wÄzeÅ).

       Pole st_size podaje rozmiar pliku w bajtach (jeżeli plik jest plikiem
       regularnym lub dowiÄzaniem symbolicznym). Rozmiarem dowiÄzania
       symbolicznego jest dÅugoÅÄ Åcieżki, na którÄ wskazuje, z wyÅÄczeniem
       koÅcowego bajtu NULL.

       Pole st_sblocks okreÅla liczbÄ bloków zajmowanych przez plik w
       jednostkach 512-bajtowych. (Liczba ta może byÄ mniejsza niż
       st_size/512, na przykÅad wtedy, gdy plik ma dziury).

       Pole st_blksize zawiera "preferowany" rozmiar bloku dla efektywnych
       operacji wejÅcia/wyjÅcia dla pliku. (Zapis do pliku mniejszych
       kawaÅków może spowodowaÄ nieefektywne operacje
       odczyt-modyfikacja-powtórny zapis).

       Nie wszystkie systemy plików pod Linuksem obsÅugujÄ wszystkie pola
       czasu. Niektóre systemy plików można zamontowaÄ w ten sposób, że
       dostÄp do pliku lub katalogu nie powoduje uaktualnienia pola st_atime.
       (Patrz noatime, nodiratime i relatime w mount(8) oraz powiÄzane
       informacje w mount(2)). Dodatkowo st_atime nie jest aktualizowane,
       jeÅli plik jest otwierany z flagÄ O_NOATIME, patrz open(2).

       Pole st_atime jest zmieniane przez każdy dostÄp do pliku, np. przez
       execve(2), mknod(2), pipe(2), utime(2) i read(2) (w razie odczytania
       wiÄcej niż zera bajtów). Inne procedury, jak mmap(2) mogÄ, ale nie
       muszÄ, zaktualizowaÄ st_atime.

       Zazwyczaj pole st_mtime jest zmieniane przez modyfikowanie pliku, np.
       przez mknod(2), truncate(2), utime(2) i write(2) (wiÄcej niż zera
       bajtów). Co wiÄcej st_mtime katalogu jest zmieniane przy tworzeniu
       plików w tym katalogu lub ich usuwaniu. Pole st_mtime nie jest
       zmieniane po zmianach wÅaÅciciela, grupy, liczby dowiÄzaÅ (hard links)
       czy uprawnieÅ.

       Pole st_ctime jest zmieniane przy zapisywaniu lub ustawianiu informacji
       i-wÄzÅa (np. wÅaÅciciela, grupy, liczby dowiÄzaÅ, praw itp.).

       POSIX odnosi siÄ do bitów st_mode odpowiadajÄcych masce S_IFMT (zob.
       poniżej) jako typu pliku, 12 bitów odpowiadajÄcych masce 07777 jako
       bitów trybu pliku i najmniej znaczÄcych 9 bitów (0777) jako bitów
       uprawnieÅ pliku.

       Zdefiniowane sÄ nastÄpujÄce wartoÅci masek do typu pliku z pola
       st_mode:

           S_IFMT     0170000   maska bitowa dla pola bitowego typu pliku

           S_IFSOCK   0140000   gniazdo
           S_IFLNK    0120000   dowiÄzanie symboliczne (symbolic link)
           S_IFREG    0100000   plik regularny
           S_IFBLK    0060000   urzÄdzenie blokowe
           S_IFDIR    0040000   katalog
           S_IFCHR    0020000   urzÄdzenie znakowe
           S_IFIFO    0010000   kolejka FIFO

       Dlatego, aby sprawdziÄ czy plik jest (przykÅadowo) zwykÅym plikiem
       można napisaÄ:

           stat(pathname, &sb);
           if ((sb.st_mode & S_IFMT) == S_IFREG) {
               /* ObsÅuga zwykÅego pliku */
           }

       Ponieważ testy w powyższej postaci sÄ popularne, dodatkowe makra sÄ
       zdefiniowane przez POSIX w celu umożliwienia sprawdzenia typu pliku w
       st_mode w spójniejszej formie:

           S_ISREG(m)  czy plik jest regularny?

           S_ISDIR(m)  katalog?

           S_ISCHR(m)  urzÄdzenie znakowe?

           S_ISBLK(m)  urzÄdzenie blokowe?

           S_ISFIFO(m) kolejka FIFO (potok nazwany)?

           S_ISLNK(m)  dowiÄzanie symboliczne? (Nie w POSIX.1-1996).

           S_ISSOCK(m) gniazdo? (Nie w POSIX.1-1996).

       Poprzedni przykÅad kodu można dlatego przepisaÄ w nastÄpujÄcy sposób:

           stat(pathname, &sb);
           if (S_ISREG(sb.st_mode)) {
               /* ObsÅuga zwykÅego pliku */
           }

       Definicje wiÄkszoÅci powyższych makr sprawdzajÄcych typ pliku sÄ
       udostÄpniane, jeÅli tylko któraÅ z nastÄpujÄcych funkcji makd
       sprawdzajÄcych jest zdefiniowana: _BSD_SOURCE (w 2.19 i
       wczeÅniejszych), _SVID_SOURCE (w glibc 2.19 i wczeÅniejszych) lub
       _DEFAULT_SOURCE (w glibc 2.20 i późniejszych). Dodatkowo, definicje
       wszystkich powyższych makr z wyjÄtkiem S_IFSOCK i S_ISSOCK() sÄ
       udostÄpniane jeÅli zdefiniowano _XOPEN_SOURCE. Zdefiniowanie S_IFSOCK
       można również uwidoczniÄ definiujÄc _XOPEN_SOURCE z wartoÅciÄ
       wiÄkszÄ lub równÄ 500.

       Zdefiniowanie S_ISSOCK() jest uwidocznione, jeÅli zdefiniowano dowolne
       z nastÄpujÄcych makr sprawdzajÄcych: _BSD_SOURCE (w 2.19 i
       wczeÅniejszych), _DEFAULT_SOURCE (w glibc 2.20 i późniejszych),
       _XOPEN_SOURCE z wartoÅciÄ wiÄkszÄ lub równÄ 500 lub _POSIX_C_SOURCE z
       wartoÅciÄ wiÄkszÄ lub równÄ 200112L.

       Zdefiniowane sÄ nastÄpujÄce wartoÅci masek do czÄÅci okreÅlajÄcej tryb
       pliku w polu st_mode:

           S_ISUID     04000   bit "set-used-ID"
           S_ISGID     02000   bit "set-group-ID" (patrz niżej)
           S_ISVTX     01000   bit "sticky" (patrz niżej)

           S_IRWXU     00700   wÅaÅciciel ma prawa odczytu, zapisu i wykonania
           S_IRUSR     00400   wÅaÅciciel ma prawa odczytu
           S_IWUSR     00200   wÅaÅciciel ma prawa zapisu
           S_IXUSR     00100   wÅaÅciciel ma prawa wykonania

           S_IRWXG     00070   grupa ma prawa odczytu, zapisu i wykonania
           S_IRGRP     00040   grupa ma prawa odczytu
           S_IWGRP     00020   grupa ma prawa zapisu
           S_IXGRP     00010   grupa ma prawa wykonania

           S_IRWXO     00007   inni (nie z grupy) majÄ prawo odczytu, zapisu i
                               wykonania
           S_IROTH     00004   inni majÄ prawa odczytu
           S_IWOTH     00002   inni majÄ prawa zapisu
           S_IXOTH     00001   inni majÄ prawa wykonania

       Bit "set-group-ID" (S_ISGID) ma kilka specjalnych znaczeÅ. Ustawiony na
       katalogu oznacza, że dla tego katalogu powinna byÄ używana semantyka
       BSD: pliki w nim utworzone dziedziczÄ identyfikator grupy z katalogu, a
       nie z efektywnego identyfikatora grupy procesu tworzÄcego plik, ponadto
       tworzone katalogi bÄdÄ miaÅy także ustawiony bit S_ISGID. Dla pliku,
       który nie ma ustawionego bitu wykonywania dla grupy (S_IXGRP), bit
       "set-group-ID" oznacza obowiÄzkowe blokowanie pliku/rekordu.

       Bit "sticky" (S_ISVTX) ustawiony na katalogu oznacza, że tylko
       wÅaÅciciel pliku lub wÅaÅciciel katalogu albo proces uprzywilejowany
       może usunÄÄ plik w tym katalogu lub zmieniÄ nazwÄ tego pliku.

   fstatat()
       WywoÅanie systemowe fstatat() dziaÅa w ten sam sposób co stat(), z
       wyjÄtkiem opisanych tu różnic.

       JeÅli Åcieżka podana w pathname jest wzglÄdna, jest to interpretowane
       w odniesieniu do katalogu do którego odnosi siÄ deskryptor pliku dirfd
       (zamiast w odniesieniu do bieżÄcego katalogu roboczego procesu
       wywoÅujÄcego, jak w stosunku do Åcieżek wzglÄdnych robi to stat()).

       JeÅli pathname jest wzglÄdna a dirfd ma wartoÅÄ specjalnÄ AT_FDCWD, to
       pathname jest interpretowana w odniesieniu do bieżÄcego katalogu
       roboczego procesu wywoÅujÄcego (jak stat()).

       If Åcieżka pathname jest bezwzglÄdna, to dirfd jest ignorowane.

       flags mogÄ wynosiÄ albo 0, albo skÅadaÄ siÄ z co najmniej jednej z
       poniższych opcji poÅÄczonych operatorem OR:

       AT_EMPTY_PATH (od Linuksa 2.6.39)
              JeÅli pathname jest ÅaÅcuchem pustym, to dziaÅa na pliku do
              którego odnosi siÄ dirfd (który mógÅ zostaÄ pozyskany za
              pomocÄ flagi O_PATH open(2)). JeÅli dirfd wynosi AT_FDCWD, to
              wywoÅujÄcy dziaÅa w bieżÄcym katalogu roboczym. W takim
              przypadku dirfd może odnosiÄ siÄ do każdego typu pliku, nie
              tylko katalogu. Jest to opcja charakterystyczna dla Linuksa,
              proszÄ zdefiniowaÄ _GNU_SOURCE, aby dostaÄ siÄ do jej definicji.

       AT_NO_AUTOMOUNT (od Linuksa 2.6.38)
              Nie montuje automatycznie ostatniego komponentu ("basename")
              Åcieżki podanej w pathname, jeÅli Åcieżka odnosi siÄ do
              katalogu, który jest punktem automatycznego montowania. Pozwala
              to programowi wywoÅujÄcemu zebraÄ atrybuty samego punktu
              montowania (a nie atrybuty lokalizacji, która zostaÅaby
              zamontowana). Znacznika tego można użyÄ w narzÄdziach, które
              przeszukujÄ katalogi, aby zapobiec ich automatycznemu
              montowaniu. Znacznik AT_NO_AUTOMOUNT nie ma żadnego znaczenia,
              jeÅli punkt montowania zostaÅ już wczeÅniej zamontowany. Jest
              to opcja charakterystyczna dla Linuksa, proszÄ zdefiniowaÄ
              _GNU_SOURCE, aby dostaÄ siÄ do jej definicji.

       AT_SYMLINK_NOFOLLOW
              JeÅli pathname jest dowiÄzaniem symbolicznym nie podÄża za nim,
              w zamian zwraca informacje o samym dowiÄzaniu, jak lstat().
              DomyÅlnie fstatat () podÄża za dowiÄzaniami symbolicznymi, jak
              stat().)

       WiÄcej informacji o potrzebie wprowadzenia fstatat() można znaleÅºÄ w
       podrÄczniku openat(2).

WARTOÅÄ ZWRACANA
       W przypadku powodzenia zwracane jest zero. W razie wystÄpienia bÅÄdu
       zwracane jest -1 i ustawiana jest odpowiednia wartoÅÄ zmiennej errno.

BÅÄDY
       EACCES Brak uprawnieÅ do przeszukiwania jednego z katalogów w Åcieżce
              zaczynajÄcej pathname. (Patrz także path_resolution(7)).

       EBADF  fd nie jest prawidÅowym otwartym deskryptorem pliku.

       EFAULT Niepoprawny adres.

       ELOOP  Podczas rozwiÄzywania Åcieżki napotkano zbyt wiele dowiÄzaÅ
              symbolicznych.

       ENAMETOOLONG
              Åcieżka pathname jest zbyt dÅuga.

       ENOENT SkÅadnik Åcieżki pathname nie istnieje lub pathname jest pustym
              ÅaÅcuchem znaków.

       ENOMEM Brak pamiÄci (tj. pamiÄci jÄdra).

       ENOTDIR
              SkÅadnik Åcieżki pathname nie jest katalogiem.

       EOVERFLOW
              pathname lub fd odnosi siÄ do pliku, numeru i-wÄzÅa lub numeru
              bloków, których rozmiar nie jest reprezentowalny w -
              odpowiednio - typie off_t, ino_t, blkcnt_t. BÅÄd ten może
              wystÄpiÄ na przykÅad wtedy, gdy aplikacja skompilowana na
              platformie 32-bitowej bez -D_FILE_OFFSET_BITS=64 wywoÅa stat ()
              na pliku, którego rozmiar jest wiÄkszy niż (1<<31)-1 bajtów.

       MogÄ wystÄpiÄ nastÄpujÄce dodatkowe bÅÄdy dla fstatat():

       EBADF  dirfd nie jest prawidÅowym deskryptorem pliku.

       EINVAL Podano nieprawidÅowÄ opcjÄ w flags.

       ENOTDIR
              pathname jest wzglÄdna a dirfd jest deskryptorem pliku
              odnoszÄcym siÄ do pliku zamiast do katalogu.

WERSJE
       fstatat() zostaÅo dodane do Linuksa w jÄdrze 2.6.16; obsÅugÄ biblioteki
       dodano do glibc w wersji 2.4.

ZGODNE Z
       stat(), fstat(), lstat(): SVr4, 4.3BSD, POSIX.1-2001, POSIX.1.2008.

       fstatat(): POSIX.1-2008.

       WedÅug POSIX.1-2001 lstat() na dowiÄzaniu symbolicznym powinien
       zwróciÄ poprawne wartoÅci tylko w polu st_size i w czÄÅci pola st_mode
       zwiÄzanej z typem pliku struktury stat. POSIX.1-2008 zaostrza tÄ
       specyfikacjÄ, wymagajÄc od lstat() zwracania poprawnych informacji we
       wszystkich polach z wyjÄtkiem bitów trybu w st_mode.

       Używanie pól st_blocks i st_blksize może byÄ nieprzenoÅne. (ByÅy
       wprowadzone w BSD; interpretacje różniÄ siÄ zarówno miÄdzy
       systemami, jak i na jednym systemie, jeÅli użyty jest zdalny system
       plików montowany po NFS-ie). Aby uzyskaÄ definicje typów blkcnt_t i
       blksize_t z <sys/stat.h> należy zdefiniowaÄ _XOPEN_SOURCE na wartoÅÄ
       500 lub wyższÄ (przed doÅÄczeniem jakiegokolwiek innego pliku
       nagÅówkowego).

       POSIX.1-1990  nie opisywaÅ staÅych S_IFMT, S_IFSOCK, S_IFLNK, S_IFREG,
       S_IFBLK, S_IFDIR, S_IFCHR, S_IFIFO, S_ISVTX , ale zamiast tego wymagaÅ
       używania makr S_ISDIR() itp. StaÅe S_IF* sÄ obecne w POSIX.1-2001 i
       późniejszych.

       Makra S_ISLNK()  i S_ISSOCK() nie sÄ wymienione w POSIX.1-1996, ale sÄ
       obecne w POSIX.1-2001; pierwsze z nich pochodzi z SVID 4, a drugie z
       SUSv2.

       Unix V7 (i kolejne systemy) miaÅ S_IREAD, S_IWRITE, S_IEXEC, podczas
       gdy POSIX nakazuje używanie synonimów S_IRUSR, S_IWUSR, S_IXUSR.

   Inne systemy
       WartoÅci, które byÅy (lub nadal sÄ) w użyciu w różnych systemach:

       szesn.   nazwa      ls   ósemk.   opis
       f000     S_IFMT          170000    maska bitowa dla pól bitowych typu pliku
       0000                     000000    niedziaÅajÄcy i-wÄzeÅ w SCO; nieznany typ
                                          w BSD; SVID-v2 i XPG2 majÄ zarówno 0,
                                          jak i 0100000 dla zwykÅego pliku
       1000     S_IFIFO    p|   010000    kolejka FIFO (potok nazwany)
       2000     S_IFCHR    c    020000    specjalny znakowy (V7)
       3000     S_IFMPC         030000    specjalny znakowy zwielokrotniony (V7)
       4000     S_IFDIR    d/   040000    katalog (V7)
       5000     S_IFNAM         050000    nazwany plik specjalny XENIX-a z dwoma
                                          podtypami, rozróżnianymi przez wartoÅci
                                          1, 2 w st_rdev
       0001     S_INSEM    s    000001    podtyp IFNAM semafora XENIX
       0002     S_INSHD    m    000002    podtyp IFNAM dzielonych danych XENIX
       6000     S_IFBLK    b    060000    specjalny blokowy (V7)
       7000     S_IFMPB         070000    specjalny blokowy zwielokrotniony (V7)
       8000     S_IFREG    -    100000    regularny (V7)
       9000     S_IFCMP         110000    skompresowany VxFS
       9000     S_IFNWK    n    110000    sieciowy specjalny (HP-UX)
       a000     S_IFLNK    l@   120000    dowiÄzanie symboliczne (BSD)
       b000     S_IFSHAD        130000    shadow i-wÄzeÅ ACL w Solarisie
                                          (niewidzialny w przestrzeni użytkownika)
       c000     S_IFSOCK   s=   140000    gniazdo (BSD; także "S_IFSOC" na VxFS)

       d000     S_IFDOOR   D>   150000    drzwi Solarisa
       e000     S_IFWHT    w%   160000    BSD whiteout (nieużywane dla i-wÄzÅa)
       0200     S_ISVTX         001000    bit lepkoÅci: zachowuje tekst na
                                          urzÄdzeniu wymiany nawet po użyciu (V7)
                                          zarezerwowane (SVID-v2)
                                          Dla niekatalogów: nie buforuj tego
                                          (SunOS)
                                          Dla katalogów: ograniczone prawo
                                          usuniÄcia (SVID-v4.2)
       0400     S_ISGID         002000    set-group-ID podczas wykonywania (V7)
                                          dla katalogów: używa semantyki BSD do
                                          propagacji GID
       0400     S_ENFMT         002000    egzekwowanie blokowania plików Systemu V
                                          (dzielone z S_ISGID)
       0800     S_ISUID         004000    set-user-ID podczas wykonywania (V7)
       0800     S_CDF           004000    katalog jest plikiem zależnym od
                                          kontekstu (HP-UX)

       Polecenie "sticky" pojawiÅo siÄ w wersji 32V systemu AT&T UNIX.

UWAGI
       Pod Linuksem, lstat() nie spowoduje uruchomienia akcji automontera,
       natomiast stat() - spowoduje (patrz jednakże fstatat(2)).

       Dla wiÄkszoÅci plików w katalogu /proc, stat() w polu st_size zwraca
       0, a nie rzeczywisty rozmiar pliku.

   Pola znaczników czasu
       Starsze jÄdra i starsze standardy nie obsÅugujÄ nanosekundowych pól
       znaczników czasu. Zamiast tego byÅy trzy pola znaczników czasu —
       st_atime, st_mtime i st_ctime— zapisywane jako time_t przechowujÄce
       znaczniki czasu z sekundowÄ precyzjÄ.

       Od wersji jÄdra 2.5.48 struktura stat obsÅuguje nanosekundowÄ
       dokÅadnoÅÄ wszystkich trzech pól czasowych. Nanosekundowa czÄÅÄ
       każdego z tych pól jest dostÄpna za pomocÄ nazw w postaci
       st_atim.tv_nsec, jeżeli zdefiniowano makro _BSD_SOURCE lub
       _SVID_SOURCE. Nanosekundowe pola czasowe sÄ obecnie ustandaryzowane,
       poczÄwszy od POSIX.1-2008 i w zwiÄzku z tym, poczÄwszy od wersji 2.12
       biblioteka glibc udostÄpnia również czÄÅÄ nanosekundowÄ, jeÅli
       _POSIX_C_SOURCE jest zdefiniowane na wartoÅÄ 200809L lub wiÄkszÄ, albo
       _XOPEN_SOURCE jest zdefiniowane na wartoÅÄ 700 lub wiÄkszÄ. JeÅli nie
       zdefiniowano żadnego z powyższych makr, to nanosekundowe wartoÅci sÄ
       dostÄpne w polu st_atimensec.

       Nanosekundowe pola czasowe sÄ obsÅugiwane przez XFS, JFS, Btrfs i ext4
       (od Linuksa 2.6.23). natomiast nie sÄ obsÅugiwane w ext2, ext3 i
       Reiserfs. W systemach plików, które nie obsÅugujÄ takiej dokÅadnoÅci
       czasowej, wartoÅci nanosekund w tych polach wynoszÄ 0.

   Różnice biblioteki C/jÄdra
       Z upÅywem czasu, zwiÄkszanie rozmiarów struktury stat doprowadziÅo do
       powstania trzech kolejnych wersji funkcji stat(): sys_stat() (slot
       __NR_oldstat), sys_newstat() (slot __NR_stat) i sys_stat64() (slot
       __NR_stat64) na platformach 32-bitowych takich jak i386. Pierwsze dwie
       wersje byÅy już obecne w Linuksie 1.0 (choÄ z różnymi nazwami),
       ostatniÄ dodano w Linuksie 2.4. Podobne uwagi majÄ zastosowanie do
       fstat() i lstat().

       WewnÄtrzjÄdrowe wersje struktury stat, za pomocÄ których jÄdro
       obsÅuguje te różne wersje, to odpowiednio:

              __old_kernel_stat
                     Oryginalna struktura z doÅÄ wÄskimi polami i brakiem
                     dopeÅnienia (wyrównania).

              stat   WiÄksze pole st_ino i dodane dopeÅnienie do różnych
                     czÄÅci struktury pozwalajÄce na późniejszÄ rozbudowÄ.

              stat64 Jeszcze wiÄksze pole st_ino, wiÄksze pola st_uid i st_gid
                     aby przyjÄÄ rozszerzone w Linuksie 2.4 UID-y i GID-y do
                     32 bitów i różne inne poszerzenia pól oraz jeszcze
                     wiÄcej dopeÅnieÅ w strukturze (dopeÅnione bajty zostaÅy w
                     koÅcu wykorzystane w Linuksie 2.6 po pojawieniu siÄ
                     32-bitowych identyfikatorów urzÄdzeÅ oraz czÄÅci
                     nanosekundowej w polach znaczników czasowych).

       Funkcja opakowujÄca glibc stat() ukrywa te detale przed użytkownikami,
       wywoÅujÄc najnowszÄ wersjÄ wywoÅania systemowego udostÄpnianÄ przez
       jÄdra i przepakowujÄc zwracane informacje, jeÅli jest to wymagane, dla
       starszych plików wykonywalnych.

       Na wspóÅczesnych systemach 64-bitowych wszystko jest prostsze:
       istnieje jedno wywoÅanie systemowe stat(), a jÄdro wykorzystuje
       strukturÄ stat zawierajÄcÄ pola o wystarczajÄcym rozmiarze.

       WywoÅanie systemowe niższego stopnia używane przez funkcjÄ
       opakowujÄcÄ fstatat() glibc nazywa siÄ w rzeczywistoÅci fstatat64()
       lub, na niektórych architekturach, newfstatat().

PRZYKÅAD
       Poniższy program wywoÅuje stat() i wypisuje wybrane pola zwrócone w
       strukturze stat:

       #include <sys/types.h>
       #include <sys/stat.h>
       #include <time.h>
       #include <stdio.h>
       #include <stdlib.h>

       int
       main(int argc, char *argv[])
       {
           struct stat sb;

           if (argc != 2) {
               fprintf(stderr, "Użycie: %s <Åcieżka>\n", argv[0]);
               exit(EXIT_FAILURE);
           }

           if (stat(argv[1], &sb) == -1) {
               perror("stat");
               exit(EXIT_FAILURE);
           }

           printf("Typ pliku:                 ");

           switch (sb.st_mode & S_IFMT) {
           case S_IFBLK:  printf("urzÄdzenie blokowe\n");      break;
           case S_IFCHR:  printf("urzÄdzenie znakowe\n");      break;
           case S_IFDIR:  printf("katalog\n");                 break;
           case S_IFIFO:  printf("FIFO/pipe\n");               break;
           case S_IFLNK:  printf("dowiÄzanie symboliczne\n");  break;
           case S_IFREG:  printf("zwykÅy plik\n");             break;
           case S_IFSOCK: printf("gniazdo\n");                 break;
           default:       printf("typ nieznany\n");            break;
           }

           printf("numer I-wÄzÅa:            %ld\n", (long) sb.st_ino);

           printf("Tryb:                     %lo (octal)\n",
                   (unsigned long) sb.st_mode);

           printf("Liczba dowiÄzaÅ:           %ld\n", (long) sb.st_nlink);
           printf("WÅaÅciciel:                UID=%ld   GID=%ld\n",
                   (long) sb.st_uid, (long) sb.st_gid);

           printf("Preferowany rozmiar bloku I/O: %ld bajtów\n",
                   (long) sb.st_blksize);
           printf("Rozmiar bloku:                 %lld bajtów\n",
                   (long long) sb.st_size);
           printf("Liczba zaalokowanych bloków:   %lld\n",
                   (long long) sb.st_blocks);

           printf("Ostatnia zmiana stanu:    %s", ctime(&sb.st_ctime));
           printf("Ostatni dostÄp do pliku:  %s", ctime(&sb.st_atime));
           printf("Ostatnia zmiana pliku:    %s", ctime(&sb.st_mtime));

           exit(EXIT_SUCCESS);
       }

ZOBACZ TAKŻE
       ls(1), stat(1), access(2), chmod(2), chown(2), readlink(2), utime(2),
       capabilities(7), symlink(7)

O STRONIE
       Angielska wersja tej strony pochodzi z wydania 4.07 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/.

TÅUMACZENIE
       Autorami polskiego tÅumaczenia niniejszej strony podrÄcznika man sÄ:
       Przemek Borys (PTM) <pborys@dione.ids.pl>, Robert Luberda
       <robert@debian.org> i MichaÅ KuÅach <michal.kulach@gmail.com>.

       Polskie tÅumaczenie jest czÄÅciÄ projektu manpages-pl; uwagi, pomoc,
       zgÅaszanie bÅÄdów na stronie http://sourceforge.net/projects/manpages-
       pl/. Jest zgodne z wersjÄ  4.07 oryginaÅu.



Linux                             2016-03-15                           STAT(2)