Provided by: manpages-pl-dev_20060617-1_all bug

NAZWA

       stat, fstat, lstat - pobiera status 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 filedes, struct stat *buf);
       int lstat(const char *path, struct stat *buf);

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
       linkiem  symbolicznym,  to  zwraca  status  tego linka, a nie pliku, do
       którego się ten link 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 filedes.

       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 */
              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 określa urządzenie, na którym plik się znajduje.

       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 regularny
       lub jest 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  nie powoduje uaktualnienia pola st_atime. (Patrz `noatime' w
       mount(8)).

       Pole st_atime jst zmieniane przez 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ą,  zmienić
       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ż  zero
       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  twardych  linków
       (hardlinks) czy praw dowiązań.

       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 UID'
       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, a
       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, lub proces uprzywilejowany
       może usunąć plik w tym katalogu lub zmienić nazwę tego pliku.

UWAGI LINUKSOWE

       Od wersji  jądra  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,  albo  st_atimensec,  jeżeli nie
       zdefiniowano żadnego  z  tych  makr.  W  systemach  plików,  które  nie
       obsługują  takiej  dokładności  czasowej,  wartości  nanosekund  w tych
       polach wynoszą 0.

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

WARTOŚĆ ZWRACANA

       Po sukcesie zwracane jest zero. Po błędzie -1 i ustawiane jest errno.

BŁĘDY

       EACCES Brak  uprawnień  do przeszukiwania jednego z katalogów w ścieżce
              zaczynającej path. (Patrz także path_resolution(2)).

       EBADF  filedes jest nieprawidłowy.

       EFAULT Niepoprawny adres.

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

       ENAMETOOLONG
              Zbyt długa nazwa pliku.

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

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

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

ZGODNE Z

       Funkcje stat() i fstat() są zgodne z SVr4, SVID, POSIX, X/OPEN, 4.3BSD.
       Funkcja   lstat()  jest  zgodna  z  4.3BSD  i  SVr4.  SVr4  dokumentuje
       następujące dodatkowe błędy fstat(): EINTR, ENOLINK i  EOVERFLOW.  SVr4
       dokumentuje  następujące  dodatkowe  błędy  stat()  i  lstat():  EINTR,
       EMULTIHOP, ENOLINK i EOVERFLOW. Używanie  pól  st_blocks  i  st_blksize
       może  być  mało  przenośne. (Zostały wprowadzone w BSD, nie są podawane
       przez POSIX. Interpretacja różni  się  między  systemami,  a  nawet  na
       jednym systemie, jeżeli zaangażowane są montowania NFS).

       Standard  POSIX   nie opisuje bitów 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. Makra S_ISLNK i S_ISSOCK nie występują w
       POSIX.1-1996, ale oba będą w następnej wersji standardu POSIX; pierwsze
       z tych makr jest wzięte z SVID, a drugie z SUSv2.

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

INNE SYSTEMY

       Wartości, które były (lub nadal są) w użyciu w różnych systemach:

       szesnastkowo   nazwa      ls   ósemkowo   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 XENIXa
                                                 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 (niedost. w przestrz. użytkow.)
       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 sticky': zachowaj wyswappowany tekst nawet po użyciu(V7)
                                                 zarezerwowane (SVID-v2)
                                                 Dla niekatalogów: nie buforuj tego pliku (SunOS)
                                                 Dla katalogów: flaga ograniczonego usuwania (SVID-v4.2)
       0400           S_ISGID         002000     set-group-ID podczas wykonywania (V7)
                                                 dla katalogów: używaj semantyki BSD propagowania ID grupy
       0400           S_ENFMT         002000     egzekwowanie blokowanie plików SysV (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 wersji32V systemu AT&T UNIX.

ZOBACZ TAKŻE

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