table of contents
STAT(2) | Podręcznik programisty Linuksa | STAT(2) |
NAZWA¶
stat, fstat, lstat - pobieranie stanu plikuSKŁADNIA¶
#include <sys/types.h>Wymagane ustawienia makr biblioteki glibc (patrz feature_test_macros(7)):
_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.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).
- 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).
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, 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
- (stat()) path odnosi się do pliku, którego rozmiar nie jest reprezentowalny w typie off_t. Może się to zdarzyć, jeśli 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 bitów.
ZGODNE Z¶
Opisywane wywołanie systemowe są zgodne z SVr4, BSD 4.3, POSIX.1-2001.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 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ępny 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 sticky": zachowuje 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żywa semantyki BSD do | ||||
propagowania ID grupy | ||||
0400 | S_ENFMT | 002000 | egzekwowanie blokowania 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) |
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.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.40 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> i Robert Luberda <robert@debian.org>. 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.40 oryginału.2011-10-04 | Linux |