Scroll to navigation

STAT(2) Linux Programmeurs Handleiding STAT(2)

NAAM

stat, fstat, lstat, fstatat - verkrijg bestand status.

SAMENVATTING

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int stat(const char *padnaam, struct stat *statbuf);
int fstat(int fd, struct stat *statbuf);
int lstat(const char *padnaam, struct stat *statbuf);
#include <fcntl.h>           /* Definitie van AT_* constanten */
#include <sys/stat.h>
int fstatat(int dirfd, const char *padnaam, struct stat *statbuf,
            int vlaggen);

Feature Test Macro´s eisen in glibc (zie feature_test_macros(7)):

lstat():

/* glibc 2.19 en eerder */ _BSD_SOURCE
|| /* Vanaf glibc 2.20 */ _DEFAULT_SOURCE
|| _XOPEN_SOURCE >= 500
|| /* Vanaf glibc 2.10: */ _POSIX_C_SOURCE >= 200112L

fstatat():

_POSIX_C_SOURCE >= 200809L
_ATFILE_SOURCE

BESCHRIJVING

Deze functies retourneren informatie over een bestand in de buffer aangewezen door statbuf. Er zijn geen rechten vereist op het bestand zelf, maar —in het geval van stat(), fstatat() en lstat()— zijn uitvoer (zoek) rechten vereist op alle mappen in padnaam die naar het bestand leiden.

stat() en fstatat() geven informatie over het bestand aangewezen door padnaam; de verschillen voor fstatat() worden hieronder beschreven.

lstat() is gelijk aan stat(), behalve dat als padnaam een symbolische koppeling is, dan informatie over de koppeling zéqlf wordt teruggegeven, en niet van het bestand waar naar verwezen wordt.

fstat() is gelijk aan stat(), behalve dat het bestand van welk de informatie wordt opgevraagd wordt gespecificeerd door de bestandsindicator fd.

De stat structuur

Al deze systeem aanroepen retourneren een stat structuur, die de volgende velden bevat:


struct stat {

dev_t st_dev; /* ID van het apparaat dat het bestand bevat */
ino_t st_ino; /* inode nummer */
mode_t st_mode; /* bestandstype en modus */
nlink_t st_nlink; /* aantal harde koppelingen */
uid_t st_uid; /* gebruiker ID van eigenaar */
gid_t st_gid; /* groep ID van eigenaar */
dev_t st_rdev; /* apparaat ID (als speciaal bestand) */
off_t st_size; /* totale grootte, in bytes */
blksize_t st_blksize; /* Blok grootte voor bestandssysteem I/O */
blkcnt_t st_blocks; /* Aantal toegekende 512B blokken */
/* Vanaf Linux 2.6, ondersteund de kernel nanoseconden
precisie voor de volgende tijdstempel velden.
Voor details over vóór Linux 2.6, zie OPMERKINGEN. */
struct timespec st_atim; /* Tijdstip laatste toegang */
struct timespec st_mtim; /* Tijdstip laatste wijziging */
struct timespec st_ctim; /* Tijdstip laatste status verandering */ #define st_atime st_atim.tv_sec /* achterwaartse compatibiliteit */ #define st_mtime st_mtim.tv_sec #define st_ctime st_ctim.tv_sec };

NOTITIE: de volgorde van de velden in de stat structuur varieert over de verschillende architecturen. Bovendien toont bovenstaande definitie niet de opvul bytes die aanwezig kunnen zijn tussen sommige velden op de diverse architecturen. Raadpleeg de glibc en kernel broncode als u deze details moet kennen.

Opmerking: vanwege prestatie redenen en vanwege de eenvoud, mogen diverse velden in de stat structuur status informatie bevatten over verschillende momenten gedurende de uitvoer van de systeem aanroep. Bijvoorbeeld, als st_mode of st_uid werd veranderd door een ander proces door de aanroep van chmod(2) of chown(2), dan mag stat(2) de oude st_mode teruggeven, samen met de nieuwe st_uid, of de oude st_uid samen met de nieuwe st_mode.

De velden in de stat structure zijn als volgt:

Dit veld beschrijft het apparaat op welk zich het bestand bevind. (De major(3) en minor(3) macro´s kunnen bruikbaar zijn om het apparaat ID in dit veld te ontleden.)
Dit veld bevat het inode nummer van het bestand.
Dit veld bevat het type van het bestand en mode. Zie inode(7) voor verdere informatie.
Dit veld bevat het aantal harde koppelingen naar het bestand.
Dit veld bevat het gebruikers ID van de eigenaar van het bestand.
Dit veld beat het ID van de groep eigenaar van het bestand.
Dit veld beschrijft het apparaat dat dit bestand (inode) voorsteld.
Dit veld geeft de grootte van het bestand (als het een regulier bestand of een symbolische koppeling is) in bytes. De grootte van de een symbolische koppeling is gelijk aan de lengte van de padnaam die het bevat, zonder de afsluitende nul.
Dit veld geeft de "voorkeur" blok grootte voor efficiënte bestandssysteem invoer/uitvoer.
Dit veld bevat een indicatie van het aantal blokken toegewezen aan het bestand, in 512-byte eenheden. (Deze kan kleiner zijn dan st_size/512 als het bestand gaten bevat.)
Dit is de laatste toegangstijd van de bestands data.
Dit is de tijd van de laatste modificatie van de bestands data/.
Dit is de tijdsstempel van de laatste status verandering van het bestand (tijd van de laatste verandering van de inode).

Zie inode(7) voor verdere informatie over de velden hierboven.

fstatat()

De fstatat() systeem aanroep is een meer algemeen interface voor het verkrijgen van bestandsinformatie dat nog steeds exact hetzelfde gedrag kan bieden van elk van stat(), lstat(), and fstat().

Als de padnaam opgegeven in padnaam relatief is, dan wordt deze geïnterpreteerd als relatief aan de map aangewezen door de bestandsindicator dirfd (in plaats van relatief ten opzichte van de huidige werkmap van het aanroepende proces, zoals dit gedaan wordt door stat() en lstat() voor een relatieve padnaam).

Als padnaam relatief is en dirfd heeft de speciale waarde AT_FDCWD, dan wordt padnaam geïnterpreteerd als relatief ten opzichte van de huidige werkmap van het aanroepende proces (zoals stat() en lstat()).

Als padnaam absoluut is, dan wordt mapbi genegeerd.

vlaggen kan ofwel 0 zijn, of kan een of meer van de volgende vlaggen ORed bevatten:

Als padnaam een lege tekenreeks is, werk dan op het bestand aangewezen doorzoek dirfd (die kan zijn verkregen door het gebruik van open(2) O_PATH vlag). In dit geval kan dirfd naar elk type bestand wijzen, niet slechts een map, en het gedrag van fstatat() is vergelijkbaar met dat van fstat(). Als dirfd gelijk is aan AT_FDCWD, dan werkt de aanroep op de huidige werkmap. Deze vlag is Linux-specifiek; definieer _GNU_SOURCE om de definiete te verkrijgen.
Koppel de uiteinde ("basename") component van padnaam niet automatisch aan als het een map is met een automatisch aankoppelpunt. Dit maakt het voor de aanroeper mogelijk om attributen van een automatisch aankoppelpunt te verzamelen (in plaats van die van de locatie die aangekoppeld zou worden). Instantieer vanaf Linux 4.14 geen niet-bestaande naam in een map die bedoeld is voor automatische aankoppelpunten. Deze vlag heeft geen effect als het aankoppelpunt al aangekoppeld was.
Beide stat() en lstat() werken alsof AT_NO_AUTOMOUNT werd gezet.
AT_NO_AUTOMOUNT kan worden gebruikt in hulpmiddelen die mappen scannen om ter voorkoming van het massaal aankoppelen van een map van automatische aankoppelpunten.
De vlag is Linux specifiek; definieer _GNU_SOURCE om zijn definitie te verkrijgen.
Als padnaam een symbolische koppeling is, volg deze niet: in plaats daarvan retourneer informatie over de koppeling zelf, zoals lstat(). (Standaard volgt fstatat() symbolische koppelingen, net als stat().)

Zie openat(2) voor een uitleg over de noodzaak van fstatat().

EIND WAARDE

Bij succes wordt nul teruggegeven. Bij falen wordt -1 teruggegeven en wordt errno overeenkomstig gezet.

FOUTEN

Het doorzoek recht werd geweigerd voor een van de mappen in de pad voorvoegsel van padnaam. (Zie ook path_resolution(7).)
bi is niet een geldige open-voor-schrijven bestandindicator.
Verkeerd adres.
Teveel symbolische koppelingen werden tegengekomen bij het doorlopen van padnaam.
padnaam is te lang.
Een map-deel van padnaam zou toegankelijk geweest zijn maar bestaat niet of was een zwevende symbolische koppeling.
padnaam is een lege tekenreeks en AT_EMPTY_PATH werd niet opgegeven in vlaggen.
Geheugen is op (kernel geheugen).
Een onderdeel in het pad voorvoegsel in padnaam is geen map.
padnaam of fd wijst naar een bestand waarvan grootte, inode nummer of aantal blokken niet kan worden gerepresenteerd in respectievelijk de velden off_t, ino_t, of blkcnt_t. Deze fout kan optreden wanneer bij voorbeeld een applicatie die compileert werd op een 32-bit platform zonder -D_FILE_OFFSET_BITS=64, stat() aanroept op een bestand waarvan de grootte meer is dan (1<<31)-1 bytes.

De volgende extra fouten kunnen optreden voor fstatat():

mapbi is geen geldige bestandsindicator.
Ongeldige vlag opgegeven in vlaggen.
padnaam is relatief en mapbi is een bestandsindicator die naar een bestand wijst die geen map is.

VERSIES

fstatat() werd toegevoegd aan Linux in kernel 2.6.16; bibliotheek ondersteuning werd toegevoegd aan glibc in versie 2.4.

VOLDOET AAN

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

fstatat(): POSIX.1-2008.

Volgens POSIX.1-2001, moet lstat() voor een symbolische koppeling geldige informatie retourneren in het st_size veld en het bestandstype van het st_mode veld van de stat structure. POSIX.1-2008 vernauwt deze specificatie door te vereisen dat lstat() geldige informatie moet retourneren in alle velden behalve de mode bits in st_mode.

Gebruik van de st_blocks en st_blksize velden is minder overdraagbaar. (Deze werden geïntroduceerd in BSD. De interpretatie verschilt tussen systemen, en mogelijk zelfs op een enkel systeem waar NFS koppelingen gebruikt worden.)

OPMERKINGEN

Tijdstempel velden

Oudere kernels en oudere standaarden ondersteunden nanoseconden tijdstempel velden niet. In plaats daarvan waren er drie tijdstempel velden —st_atime, st_mtime, en st_ctime—aangeduid als time_t die tijdstempels noteerden in een-seconde precisie.

Vanaf kernel 2.5.48 ondersteund de stat structure nanoseconden resolutie in de drie bestandstijdstepel velden. De nanoseconden componenten van elke tijdstempel zijn beschikbaar via namen van de vorm st_atim.tv_nsec, mits geschikte test macros werden gedefinieerd. Nanoseconden tijdstempels zijn gestandaardiseerd in POSIX.1-2008, en vanaf versie 2.12 toont glibc de namen van de nanoseconden componenten als _POSIX_C_SOURCE werd gedefinieerd met een waarde 200809L of hoger, of _XOPEN_SOURCE werd gedefinieerd met een waarde 700 of hoger. Tot en met glibc 2.19 werd de definitie van de nanoseconden componenten ook gedefinieerd zodra _BSD_SOURCE of _SVID_SOURCE werden gedefinieerd. Als geen van de hier voor genoemde macros werd gedefinieerd dan worden de nanoseconden waarden getoond met de namen van de vorm st_atimensec.

C library/kernel verschillen

In de loop van de tijd hebben vergrotingen van de stat structure geleid tot drie opeenvolgende versies van stat(0: sys_stat() (slot __NR_oldstat), sys_newstat() (slot __NR_stat), en sys_stat64() (slot __NR_stat64) op 32-bit platformen zoals i386. De eerste twee versies waren al aanwezig in Linux 1.0 (hoewel met verschillende namen); de laatste werd toegevoegd in Linux 2.4. Vergelijkbare opmerkingen zijn van toepassing op fstat() en lstat().

De interne kernel versies van de stat structure die behandelt worden door de verschillende versies, zijn respectievelijk:

__old_kernel_stat
De originele structure, met nogal kleine velden en zonder opvulling.
Een groter st_ino veld en opvulling toegevoegd aan verschillende delen van de structure om toekomstige uitbreidingen toe te staan.
Een nog groter st_ino veld, grotere st_uid en st_gid velden om in de expansie van UID´s EN GID´s naar 32 bits door Linux-2.4 te voorzien, en verschillende andere vergrote velden en meer opvulling in de structure. (Diverse opvul bytes werden geconsumeerd in Linux 2.6, met de aankomst van 32-bit apparaat ID´s en nanoseconden componenten in de tijdstempel velden.)

De glibc stat() omwikkel functies verbergen deze details van de applicaties, door het aanroepen van de meest recente versie van de systeem aanroep die door de kernel beschikbaar wordt gesteld en het opnieuw inpakken van de verkregen informatie indien nodig voor oude toepassingen.

Op moderne 64-bit systemen is het leven eenvoudiger: daar bestaat een enkele stat() systeem aanroep en de kernel werkt met een stat structure die velden van voldoende grootte bevat.

De onderliggende systeem aanroep gebruikt door de glibc fstatat() omwikkel functie heet eigenlijk fstatat64() of op sommige architecturen newfstatat().

VOORBEELDEN

Het volgende programma roept lstat() aan en toont geselecteerde velden in de teruggegeven stat structure.

#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, "Usage: %s <padnaam>\n", argv[0]);
exit(EXIT_FAILURE);
}
if (lstat(argv[1], &sb) == -1) {
perror("lstat");
exit(EXIT_FAILURE);
}
printf("ID van het bevattende apparaat: [%jx,%jx]\n",
(uintmax_t) major(sb.st_dev),
(uintmax_t) minor(sb.st_dev));
printf("Bestandstype: ");
switch (sb.st_mode & S_IFMT) {
case S_IFBLK: printf("blok apparaat\n"); break;
case S_IFCHR: printf("teken apparaat\n"); break;
case S_IFDIR: printf("map\n"); break;
case S_IFIFO: printf("FIFO/pijp\n"); break;
case S_IFLNK: printf("symbolische koppeling\n"); break;
case S_IFREG: printf("regulier bestand\n"); break;
case S_IFSOCK: printf("socket\n"); break;
default: printf("onbekend?\n"); break;
}
printf("I-node number: %ju\n", (uintmax_t) sb.st_ino);
printf("Mode: %jo (octal)\n",
(uintmax_t) sb.st_mode);
printf("Link count: %ju\n", (uintmax_t) sb.st_nlink);
printf("Ownership: UID=%ju GID=%ju\n",
(uintmax_t) sb.st_uid, (uintmax_t) sb.st_gid);
printf("Voorkeur I/O blok grootte: %jd bytes\n",
(intmax_t) sb.st_blksize);
printf("Bestandsgrootte: %jd bytes\n",
(intmax_t) sb.st_size);
printf("Toegewezen blokken: %jd\n",
(intmax_t) sb.st_blocks);
printf("Last status change: %s", ctime(&sb.st_ctime));
printf("Last file access: %s", ctime(&sb.st_atime));
printf("Last file modification: %s", ctime(&sb.st_mtime));
exit(EXIT_SUCCESS); }

ZIE OOK

ls(1), stat(1), access(2), chmod(2), chown(2), readlink(2), statx(2), utime(2), capabilities(7), inode(7), symlink(7)

COLOFON

Deze pagina is onderdeel van release 5.10 van het Linux man-pages-project. Een beschrijving van het project, informatie over het melden van bugs en de nieuwste versie van deze pagina zijn op https://www.kernel.org/doc/man-pages/ te vinden.

VERTALING

De Nederlandse vertaling van deze handleiding is geschreven door Jos Boersema <joshb@xs4all.nl>, Mario Blättermann <mario.blaettermann@gmail.com> en Luc Castermans <luc.castermans@gmail.com>

Deze vertaling is vrije documentatie; lees de GNU General Public License Version 3 of later over de Copyright-voorwaarden. Er is geen AANSPRAKELIJKHEID.

Indien U fouten in de vertaling van deze handleiding zou vinden, stuur een e-mail naar debian-l10n-dutch@lists.debian.org.

13 augustus 2020 Linux