Provided by: manpages-pl-dev_0.7-1_all bug

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.