Provided by: manpages-pl-dev_4.13-4_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 *statbuf);
       int fstat(int fd, struct stat *statbuf);
       int lstat(const char *pathname, struct stat *statbuf);

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

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

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

       lstat():
           /* glibc 2.19 and earlier */ _BSD_SOURCE
               || /* Since glibc 2.20 */ _DEFAULT_SOURCE
               || _XOPEN_SOURCE >= 500
               || /* Since 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 statbuf. 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()   is identical to stat(), except that if pathname is a symbolic link, then it returns information
       about the link itself, not the file that the link refers to.

       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.

   The stat structure
       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.

       The fields in the stat structure are as follows:

       st_dev This field describes the device on which this file resides.  (The major(3)  and  minor(3)   macros
              may be useful to decompose the device ID in this field.)

       st_ino This field contains the file's inode number.

       st_mode
              This field contains the file type and mode.  See inode(7)  for further information.

       st_nlink
              This field contains the number of hard links to the file.

       st_uid This field contains the user ID of the owner of the file.

       st_gid This field contains the ID of the group owner of the file.

       st_rdev
              This field describes the device that this file (inode) represents.

       st_size
              This  field gives the size of the file (if it is a regular file or a symbolic link) in bytes.  The
              size of a symbolic link is the length of the pathname it  contains,  without  a  terminating  null
              byte.

       st_blksize
              This field gives the "preferred" block size for efficient filesystem I/O.

       st_blocks
              This  field indicates the number of blocks allocated to the file, in 512-byte units.  (This may be
              smaller than st_size/512 when the file has holes.)

       st_atime
              This is the time of the last access of file data.

       st_mtime
              This is the time of last modification of file data.

       st_ctime
              This is the file's last status change timestamp (time of last change to the inode).

       For further information on the above fields, see inode(7).

   fstatat()
       The fstatat()  system call is a more general interface for accessing file  information  which  can  still
       provide exactly the behavior of each of stat(), lstat(), and fstat().

       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() i lstat()).

       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() i lstat()).

       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)
              If  pathname  is  an  empty  string, operate on the file referred to by dirfd (which may have been
              obtained using the open(2)  O_PATH flag).  In this case, dirfd can refer to any type of file,  not
              just  a  directory,  and  the  behavior  of fstatat()  is similar to that of fstat().  If dirfd is
              AT_FDCWD, the call operates on the current working directory.  This flag is Linux-specific; define
              _GNU_SOURCE to obtain its definition.

       AT_NO_AUTOMOUNT (od Linuksa 2.6.38)
              Don't automount the terminal ("basename") component of pathname if it is a directory  that  is  an
              automount  point.   This allows the caller to gather attributes of an automount point (rather than
              the location it would mount).  Since Linux 4.14, also don't instantiate a nonexistent name  in  an
              on-demand  directory  such  as used for automounter indirect maps.  This flag has no effect if the
              mount point has already been mounted over.

              Both stat()  and lstat()  act as though AT_NO_AUTOMOUNT was set.

              The AT_NO_AUTOMOUNT can be used in tools that scan directories to prevent mass-automounting  of  a
              directory of automount points.

              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

       Po  pomyślnym  zakończeniu  zwracane  jest zero. Po błędzie zwracane jest -1 i odpowiednio ustawiane jest
       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 A component of pathname does not exist or is a dangling symbolic link.

       ENOENT pathname is an empty string and AT_EMPTY_PATH was not specified in flags.

       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).

UWAGI

   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ą.

       Since  kernel  2.5.48,  the  stat  structure  supports nanosecond resolution for the three file timestamp
       fields.  The nanosecond components of each timestamp are available via names of the form st_atim.tv_nsec,
       if suitable feature test macros are defined.  Nanosecond timestamps were  standardized  in  POSIX.1-2008,
       and,  starting  with  version  2.12,  glibc  exposes the nanosecond component names if _POSIX_C_SOURCE is
       defined with the value 200809L or greater, or _XOPEN_SOURCE is defined with the value 700 or greater.  Up
       to and including glibc  2.19,  the  definitions  of  the  nanoseconds  components  are  also  defined  if
       _BSD_SOURCE  or  _SVID_SOURCE  is  defined.   If  none of the aforementioned macros are defined, then the
       nanosecond values are exposed with names of the form st_atimensec.

   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ŁADY

       Poniższy program wywołuje lstat() i wypisuje wybrane pola zwrócone w strukturze stat:

       #include <sys/types.h>
       #include <sys/stat.h>
       #include <stdint.h>
       #include <time.h>
       #include <stdio.h>
       #include <stdlib.h>
       #include <sys/sysmacros.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 (lstat(argv[1], &sb) == -1) {
               perror("lstat");
               exit(EXIT_FAILURE);
           }

           printf("ID of containing device:  [%jx,%jx]\n",
                   (uintmax_t) major(sb.st_dev),
                   (uintmax_t) minor(sb.st_dev));

           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:            %ju\n", (uintmax_t) sb.st_ino);

           printf("Tryb:                     %jo (octal)\n",
                   (uintmax_t) sb.st_mode);

           printf("Liczba dowi◈za◈:               %ju\n", (uintmax_t) sb.st_nlink);
           printf("W◈a◈ciciel:                    UID=%ju   GID=%ju\n",
                   (uintmax_t) sb.st_uid, (uintmax_t) sb.st_gid);

           printf("Preferowany rozmiar bloku I/O: %jd bajtów\n",
                   (intmax_t) sb.st_blksize);
           printf("Rozmiar bloku:                 %jd bajtów\n",
                   (intmax_t) sb.st_size);
           printf("Liczba zaalokowanych bloków:   %jd\n",
                   (intmax_t) 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),  statx(2),  utime(2),  capabilities(7),
       inode(7), symlink(7)

O STRONIE

       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/.

T◈UMACZENIE

       Autorami polskiego tłumaczenia niniejszej strony podręcznika  są:  Przemek  Borys  <pborys@dione.ids.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  listy  dyskusyjnej manpages-pl-
       list@lists.sourceforge.net.

Linux                                          13 sierpnia 2020 r.                                       STAT(2)