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

NAZWA

       stat, fstat, lstat - pobieranie stanu pliku

SKŁADNIA

       #include <sys/types.h>
       #include <sys/stat.h>
       #include <unistd.h>

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

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

       lstat():
           _BSD_SOURCE || _XOPEN_SOURCE >= 500 || _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED
           || /* od glibc 2.10: */ _POSIX_C_SOURCE >= 200112L

OPIS

       Funkcje  te  zwracają  informacje  o  podanym  pliku.  Do  uzyskania tej informacji nie są
       wymagane prawa dostępu do samego pliku, lecz — w przypadku stat() i lstat() — konieczne są
       prawa wykonywania (przeszukiwania) do wszystkich katalogów na prowadzącej do pliku ścieżce
       path.

       stat() zwraca status pliku wskazywanego przez path, ładując go do argumentu buf.

       lstat() jest identyczny z stat(), lecz w przypadku gdy path jest dowiązaniem symbolicznym,
       to zwraca status tego dowiązania, a nie pliku, do którego się to dowiązanie odwołuje.

       fstat()  jest  identyczny  z  stat(), z tym wyjątkiem, że plik, którego status ma zwrócić,
       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) */
               umode_t   st_mode;     /* ochrona */
               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 */
               time_t    st_atime;    /* czas ostatniego dostępu */
               time_t    st_mtime;    /* czas ostatniej modyfikacji */
               time_t    st_ctime;    /* czas ostatniej zmiany */
           };

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

       Zdefiniowane są następujące makra POSIX sprawdzające typ pliku przy użyciu pola st_mode:

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

       Dla pola st_mode zdefiniowano następujące flagi:

           S_IFMT     0170000   maska bitowa dla pól bitowych 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
           S_ISUID    0004000   bit "set-used-ID"
           S_ISGID    0002000   bit "set-group-ID" (patrz niżej)
           S_ISVTX    0001000   bit "sticky" (patrz niżej)
           S_IRWXU    00700     maska praw dostępu właściciela pliku
           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     maska praw dostępu dla grupy
           S_IRGRP    00040     grupa ma prawa odczytu
           S_IWGRP    00020     grupa ma prawa zapisu
           S_IXGRP    00010     grupa ma prawa wykonania
           S_IRWXO    00007     maska uprawnień dla innych (poza grupą)
           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.

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  path.
              (Patrz także path_resolution(7)).

       EBADF  fd jest nieprawidłowy.

       EFAULT Niepoprawny adres.

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

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

       ENOENT Składnik ścieżki path nie istnieje lub path jest pustym łańcuchem znaków.

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

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

       EOVERFLOW
              path  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.

ZGODNE Z

       Opisywane wywołanie systemowe są zgodne z SVr4, BSD 4.3, POSIX.1-2001.

       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 uprawnień 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 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

       Od wersji jądra 2.5.48 struktura stat obsługuje nanosekundową dokładność wszystkich trzech
       pól czasowych. Glibc  podaje  nanosekundową  część  każdego  z  tych  pól,  używając  albo
       st_atim.tv_nsec, jeżeli zdefiniowano makro _BSD_SOURCE lub _SVID_SOURCE. Pola te są podane
       w POSIX.1-2008 i w związku z tym, począwszy od wersji  2.12  biblioteka  glibc  udostępnia
       nazwy  tych  pól,  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. W
       systemach plików, które nie obsługują takiej dokładności czasowej, wartości  nanosekund  w
       tych polach wynoszą 0.

       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.

   Interfejs 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()  (nowe  w  jądrze  2.4; slot __NR_stat64). Funkcja opakowująca
       stat() biblioteki glibc ukrywa te szczegóły przed aplikacjami, wywołując najnowszą  wersję
       wywołania systemowego dostarczanego przez jądro i przepakowując zwracaną informację, jeśli
       jest to wymagane przez starsze aplikacje. Podobne uwagi odnoszą się do fstat() i lstat().

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

       access(2),  chmod(2),  chown(2),  fstatat(2),  readlink(2),   utime(2),   capabilities(7),
       symlink(7)

O STRONIE

       Angielska  wersja  tej  strony  pochodzi  z  wydania  3.52  projektu Linux man-pages. Opis
       projektu  oraz  informacje  dotyczące  zgłaszania  błędów  można   znaleźć   pod   adresem
       http://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ą    3.52
       oryginału.