plucky (2) lstat.2.gz

Provided by: manpages-pl-dev_4.25.1-1_all bug

NAZWA

       stat, fstat, lstat, fstatat - pobiera stan pliku

BIBLIOTEKA

       Standardowa biblioteka C (libc, -lc)

SKŁADNIA

       #include <sys/stat.h>

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

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

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

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

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

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

   Struktura stat
       Wszystkie te funkcje zwracają strukturę stat (zob. stat(3type)).

       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.

   fstatat()
       Wywołanie systemowe fstatat() jest ogólniejszym interfejsem do uzyskiwania dostępu do informacji o pliku,
       które może wciąż zapewnić zachowanie identyczne do każdego z wywołań stat(), lstat() i 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()).

       Jeśli ścieżka pathname jest bezwzględna, to dirfd jest ignorowane.

       flags mogą wynosić albo 0, albo składać się z co najmniej jednego  z  poniższych  znaczników  zsumowanych
       bitowo (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ą znacznika O_PATH open(2)). W takim przypadku dirfd może odnosić się  do
              każdego  typu  pliku,  nie  tylko  katalogu, a zachowanie fstatat() jest podobne do fstat(). Jeśli
              dirfd  wynosi  AT_FDCWD,  to  wywołanie  działa  w  bieżącym  katalogu  roboczym.  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  dokonuje  automatycznego  montowania  składowej terminala („basename”) ścieżki z pathname. Od
              Linuksa 3.1 znacznik ten jest ignorowany. Od Linuksa 4.11 znacznik ten jest implikowany.

       AT_SYMLINK_NOFOLLOW
              Jeśli pathname jest dowiązaniem symbolicznym, nie podąża za nim, w zamian zwracając  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  ustawiane  errno,  wskazując
       błąd.

BŁĘDY

       EACCES Brak  uprawnień  do  przeszukiwania  jednego z katalogów w ścieżce zaczynającej pathname (zob. też
              path_resolution(7)).

       EBADF  fd nie jest prawidłowym otwartym deskryptorem pliku.

       EBADF  (fstatat())  pathname jest względne, lecz dirfd nie wynosi ani AT_FDCWD, ani nie jest  prawidłowym
              deskryptorem pliku.

       EFAULT Niepoprawny adres.

       EINVAL (fstatat())  Podano nieprawidłową opcję we flags.

       ELOOP  Podczas rozwiązywania ścieżki napotkano zbyt wiele dowiązań symbolicznych.

       ENAMETOOLONG
              Ścieżka pathname jest zbyt długa.

       ENOENT Składnik pathname nie istnieje lub jest wiszącym dowiązaniem symbolicznym.

       ENOENT pathname jest łańcuchem pustym, a we flags nie podano AT_EMPTY_PATH.

       ENOMEM Brak pamięci (tj. pamięci jądra).

       ENOTDIR
              Składnik ścieżki pathname nie jest katalogiem.

       ENOTDIR
              (fstatat())   pathname  jest  względna,  a  dirfd jest deskryptorem pliku odnoszącym się do pliku,
              zamiast do katalogu.

       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.

STANDARDY

       POSIX.1-2008.

HISTORIA

       stat()
       fstat()
       lstat()
              SVr4, 4.3BSD, POSIX.1-2001.

       fstatat()
              POSIX.1-2008.  Linux 2.6.16, glibc 2.4.

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

   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 <stdint.h>
       #include <stdio.h>
       #include <stdlib.h>
       #include <sys/stat.h>
       #include <sys/sysmacros.h>
       #include <time.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 urządzenia:  [%x,%x]\n",
                  major(sb.st_dev),
                  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/potok\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 (ósemkowo)\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 przydzielonych 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),   stat(3type),
       capabilities(7), inode(7), symlink(7)

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 ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩ 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⟩.