Provided by: manpages-de-dev_1.11-1_all bug

BEZEICHNUNG

       stat, fstat, lstat, fstatat - Dateistatus ermitteln

ÜBERSICHT

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

       int stat(const char *Pfadname, struct stat *Puffer);
       int fstat(int fd, struct stat *Puffer);
       int lstat(const char *Pfadname, struct stat *Puffer);

       #include <fcntl.h>           /* Definition der AT_*-Konstanten */
       #include <sys/stat.h>

       int fstatat(int dirfd, const char *Pfadname, struct stat *Puffer,
                   int Schalter);

   Mit Glibc erforderliche Makros (siehe feature_test_macros(7)):

       lstat():
           /* Glibc 2.19 und früher */ _BSD_SOURCE ||
           /* Seit Glibc 2.20 */_DEFAULT_SOURCE ||
           _XOPEN_SOURCE >= 500 || _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED
           || /* seit Glibc 2.10: */ _POSIX_C_SOURCE >= 200112L

       fstatat():
           Seit Glibc 2.10:
               _XOPEN_SOURCE >= 700 || _POSIX_C_SOURCE >= 200809L
           Bis Glibc 2.10:
               _ATFILE_SOURCE

BESCHREIBUNG

       Diese  Funktionen geben Informationen über eine Datei im Puffer zurück, auf den buf zeigt.
       Dazu werden keinerlei Rechte an der angegebenen Datei benötigt, aber —im Falle von stat(),
       fstatat()  und  lstat()—  müssen  alle Verzeichnisse im Pfadnamen, der zu der Datei führt,
       durchsucht werden dürfen.

       stat() und fstatat() liefern die Informationen zu der in Pfadname  angegebenen  Datei  und
       übergibt diese an fstatat(), wie nachfolgend beschrieben.

       lstat()   ist  ähnlich  stat(),  nur  dass  falls  Pfadname  ein  symbolischer  Link  ist,
       Informationen zum Link zurückgegeben werden und nicht zur Datei, auf die der Link zeigt.

       fstat ist ähnlich stat, außer dass  die  Datei,  zu  der  Informationen  ermittelt  werden
       sollen, durch den Dateideskriptor fd angegeben wird.

       Alle  diese  Systemaufrufe  geben  eine  Struktur  vom Typ stat zurück, die folgendermaßen
       aufgebaut ist:

           struct stat {
               dev_t         st_dev;      /* Gerät */
               ino_t         st_ino;      /* INode */
               mode_t        st_mode;     /* Zugriffsrechte */
               nlink_t       st_nlink;    /* Anzahl harter Links */
               uid_t         st_uid;      /* UID des Besitzers */
               gid_t         st_gid;      /* GID des Besitzers */
               dev_t         st_rdev;     /* Typ (wenn INode-Gerät) */
               off_t         st_size;     /* Größe in Bytes*/
               blksize_t     st_blksize;  /* Blockgröße für Dateisystem-E/A */
               blkcnt_t      st_blocks;   /* Anzahl der zugewiesenen 512B-Blöcke */

              /* Seit Linux 2.6 unterstützt der Kernel Nanosekundengenauigkeit
                 für die folgenden Zeitstempelfelder.
                 Für Details vor Linux 2.6 lesen Sie ANMERKUNGEN. */

               struct timespec st_atim;  /* Zeit des letzten Zugriffs */
               struct timespec st_mtim;  /* Zeit der letzten Veränderung*/
               struct timespec st_ctim;  /* Zeit der letzten Statusänderung*/

           #define st_atime st_atim.tv_sec      /* Rückwärtskompatibilität */
           #define st_mtime st_mtim.tv_sec
           #define st_ctime st_ctim.tv_sec
           };

       Hinweis: Die Reihenfolge  der  Felder  in  der  stat-Struktur  ist  in  den  verschiedenen
       Architekturen  nicht  gleich.  Außerdem  zeigt  die  oben  genannte  Definition  nicht die
       Auffüll-Bytes, die in verschiedenen Architekturen zwischen einigen Feldern vorhanden sind.
       Im Quellcode von Glibc und Kernel finden Sie bei Bedarf Details hierzu.

       Note:  For  performance and simplicity reasons, different fields in the stat structure may
       contain state information from different moments during the execution of the system  call.
       For  example,  if  st_mode or st_uid is changed by another process by calling chmod(2)  or
       chown(2), stat()  might return the old st_mode together with the new st_uid,  or  the  old
       st_uid together with the new st_mode.

       Das  Feld  st_dev  beschreibt  das  Gerät,  auf  dem  sich die Datei befindet. (Die Makros
       major(3) und minor(3) können zum Zerlegen der Geräte-ID in diesem Feld nützlich sein.)

       Das Feld st_rdev beschreibt das Geräte, das diese Datei (Inode) repräsentiert.

       Das Feld st_size zeigt die Größe der Datei (falls es sich  um  eine  reguläre  Datei  oder
       einen  symbolischen  Link  handelt)  in Bytes an. Die Größe des symbolischen Links ist die
       Länge des enthaltenen Pfadnamens ohne abschließendes Nullbyte.

       Das Feld st_blocks gibt  die  Anzahl  der  Blöcke,  die  der  Datei  zugewiesen  sind,  in
       512-Byte-Einheiten  an.  Dies  kann  kleiner  als  st_size/512 sein, wenn die Datei Löcher
       enthält.

       Das Feld st_blksize gibt die »bevorzugte« Blockgröße für  effiziente  E/A-Operationen  des
       Dateisystems   an  (Schreiben  in  eine  Datei  in  kleineren  Teilen  kann  ineffizientes
       Lesen-Ändern-Schreiben verursachen).

       Nicht  alle  der  Linux-Dateisysteme   implementieren   auch   alle   Zeitfelder.   Einige
       Dateisystemtypen   erlauben   das   Einhängen   in   einer  Weise,  dass  Datei-  und/oder
       Verzeichniszugriffe keine Aktualisierung des  Feldes  st_atime  bewirken  (siehe  noatime,
       nodiratime  und  relatime  in  mount(8)  sowie  diesbezügliche Informationen in mount(2)).
       Außerdem wird st_atime nicht aktualisiert, wenn eine Datei mit  O_NOATIME  geöffnet  wird;
       siehe open(2).

       Das  Feld  st_atime  wird  durch  Dateizugriffe  geändert,  zum  Beispiel durch execve(2),
       mknod(2), pipe(2), utime(2) und read(2) (von mehr  als  0  Bytes).  Andere  Routinen,  wie
       mmap(2), können st_atime ändern, müssen dies aber nicht.

       Das  Feld  st_mtime verändert sich beim Einsatz von dateimodifizierenden Operationen, z.B.
       durch mknod(2), truncate(2), utime(2) und write(2) (von mehr  als  null  Bytes).  Außerdem
       wird  st_mtime  durch das Anlegen oder Löschen von Dateien in diesem Verzeichnis geändert.
       Das Feld st_mtime wird nicht durch Ändern von Besitzer, Gruppe, Hardlink-Zähler oder Modus
       verändert.

       Das  Feld  st_ctime  wird  durch  Beschreiben oder Setzen der Inode-Informationen geändert
       (d.h. Besitzer, Gruppe, Link-Zähler, Modus etc.).

       POSIX refers to the st_mode bits corresponding to the mask S_IFMT (see below) as the  file
       type,  the  12  bits  corresponding  to the mask 07777 as the file mode bits and the least
       significant 9 bits (0777) as the file permission bits.

       Die folgende Maskenwerte sind für den Dateityp des Feldes st_mode definiert:

           S_IFMT     0170000   Bitmaske für das Dateityp-Bitfeld

           S_IFSOCK   0140000   Socket
           S_IFLNK    0120000   symbolischer Link
           S_IFREG    0100000   reguläre Datei
           S_IFBLK    0060000   blockorientiertes Gerät
           S_IFDIR    0040000   Verzeichnis
           S_IFCHR    0020000   zeichenorientiertes Gerät
           S_IFIFO    0010000   FIFO

       Um beispielsweise eine reguläre Datei zu testen, könnten Sie Folgendes verwenden:

           stat(pathname, &sb);
           if ((sb.st_mode & S_IFMT) == S_IFREG) {
               /* reguläre Datei verarbeiten */
           }

       Da Tests der obigen Form häufig sind, definiert POSIX  zusätzliche  Makros,  um  präzisere
       Tests des Dateityps in st_mode zu ermöglichen:

           S_ISREG(m)  ist es eine reguläre Datei?

           S_ISDIR(m)  Verzeichnis?

           S_ISCHR(m)  zeichenorientiertes Gerät?

           S_ISBLK(m)  blockorientiertes Gerät?

           S_ISFIFO(m) FIFO (benannte Pipe)?

           S_ISLNK(m)  symbolischer Link? (nicht in POSIX.1-1996.)

           S_ISSOCK(m) Socket? (Nicht in POSIX.1-1996.)

       Der obige Code-Schnipsel sollte daher folgendermaßen geändert werden:

           stat(pathname, &sb);
           if (S_ISREG(sb.st_mode)) {
               /* reguläre Datei verarbeiten */
           }

       Die  Definitionen  der  meisten  der  oben  genannten  Testmakros  für  Dateitypen  werden
       bereitgestellt,  sofern  irgendeines  der  folgenden  Feature-Test-Makros  definiert  ist:
       _BSD_SOURCE  (in  Glibc  2.19  und  früher),  _SVID_SOURCE (in Glibc 2.19 und früher) oder
       _DEFAULT_SOURCE (in Glibc 2.20 und  neuer).  Zusätzlich  werden  Definitionen  aller  oben
       genannten   Makros  außer  S_IFSOCK  und  S_ISSOCK()  bereitgestellt,  wenn  _XOPEN_SOURCE
       definiert ist. Die Definition von S_IFSOCK kann auch durch Setzen  von  _XOPEN_SOURCE  auf
       einen Wert von 500 oder größer erreicht werden.

       Die  Definition von S_ISSOCK() ist verfügbar, wenn eines der folgenden Feature-Test-Makros
       definiert ist: _BSD_SOURCE (in Glibc 2.19 und früher), _DEFAULT_SOURCE (in Glibc 2.20  und
       früher),  _XOPEN_SOURCE  mit einem Wert von 500 oder größer oder _POSIX_C_SOURCE mit einem
       Wert von 200112L oder größer.

       Die folgende Maskenwerte sind für die Dateimodus-Komponente des Felds st_mode definiert:

           S_ISUID     04000   SUID-Bit
           S_ISGID     02000   SGID-Bit (siehe unten)
           S_ISVTX     01000   Sticky-Bit (siehe unten)

           S_IRWXU     00700   owner has read, write, and execute permission
           S_IRUSR     00400   Besitzer hat Lesezugriff
           S_IWUSR     00200   Besitzer hat Schreibzugriff
           S_IXUSR     00100   Besitzer hat Ausführungsrechte

           S_IRWXG     00070   group has read, write, and execute permission
           S_IRGRP     00040   group has read permission
           S_IWGRP     00020   Gruppe hat Schreibzugriff
           S_IXGRP     00010   Gruppe hat Ausführungsrechte

           S_IRWXO     00007   others (not in group) have read,  write,  and
                               execute permission
           S_IROTH     00004   Andere haben Lesezugriff
           S_IWOTH     00002   Andere haben Schreibzugriff
           S_IXOTH     00001   Andere haben Ausführungsrechte

       Das   SGID-Bit   (S_ISGID)  hat  verschiedene  besondere  Nutzungsmöglichkeiten:  Für  ein
       Verzeichnis bedeutet es, das die  BSD-Semantik  Anwendung  findet:  Dateien,  die  in  ihm
       erzeugt werden, erben die Gruppen-ID des Verzeichnisses und nicht die effektive Gruppen-ID
       des erzeugenden Prozesses, und dort erzeugte Verzeichnisse haben  das  SGID-Bit  ebenfalls
       gesetzt.  Für  eine  Datei,  bei  der das Bit für Gruppenausführungsrechte (S_IXGRP) nicht
       gesetzt ist, bedeutet es erzwungenes Sperren von Datei/Datensatz.

       Das »Sticky«-Bit (S_ISVTX) an einem  Verzeichnis  bedeutet,  dass  eine  Datei  in  diesem
       Verzeichnis  nur  vom  Besitzer  der Datei, dem Besitzer des Verzeichnisses, und von einem
       privilegierten Prozess umbenannt und gelöscht werden darf.

   fstatat()
       Der Systemaufruf fstatat() funktioniert genauso wie stat(), außer den  hier  beschriebenen
       Unterschieden.

       Falls  der  in  Pfadname  übergebene  Pfadname  relativ ist, wird er als relativ zu dem im
       Dateideskriptor  dirfd  referenzierten  Verzeichnis  interpretiert  (statt   relativ   zum
       aktuellen  Arbeitsverzeichnis  des  aufrufenden  Prozesses,  wie  es  bei stat() für einen
       relativen Pfadnamen erfolgt).

       Falls Pfadname relativ ist und dirfd den besonderen Wert AT_FDCWD annimmt,  wird  Pfadname
       als  relativ zum aktuellen Arbeitsverzeichnis des aufrufenden Prozesses interpretiert (wie
       stat()).

       Falls Pfadname absolut ist, wird dirfd ignoriert.

       Schalter kann entweder 0 sein oder durch bitweises ODER eines oder mehrere  der  folgenden
       Schalter gesetzt haben:

       AT_EMPTY_PATH (seit Linux 2.6.39)
              Falls  Pfadname eine leere Zeichenkette ist, wird mit der Datei gearbeitet, auf die
              dirfd verweist (dies kann mit dem O_PATH-Schalter von  open(2)  ermittelt  werden).
              Falls  dirfd  AT_FDCWD  ist, erfolgt der Aufruf im aktuellen Arbeitsverzeichnis. In
              diesem Fall kann sich dirfd  auf  jeden  Dateityp  beziehen,  nicht  unbedingt  ein
              Verzeichnis.  Dieser  Schalter ist Linux-spezifisch; definieren Sie _GNU_SOURCE, um
              dessen Definition zu ermitteln.

       AT_NO_AUTOMOUNT (seit Linux 2.6.38)
              Die Terminal-»basename«-Komponente von Pfadname wird nicht automatisch  eingehängt,
              wenn  es ein Verzeichnis ist, das selbst ein Einhängepunkt ist. Dies ermöglicht dem
              Aufrufenden, Informationen zu einem Auto-Einhängepunkt zu sammeln, anstatt  zu  dem
              Ort,  der  eingehängt  werden  würde.  Dieser Schalter kann in Werkzeugen verwendet
              werden,  die  Verzeichnisse  einlesen,  um  automatische  Masseneinhängungen  eines
              Verzeichnisses  zu  verhindern,  welches  Auto-Einhängepunkte enthält. Der Schalter
              AT_NO_AUTOMOUNT ist unwirksam, wenn der  Einhängepunkt  bereits  eingehängt  wurde.
              Dieser  Schalter  ist  Linux-spezifisch;  definieren  Sie  _GNU_SOURCE,  um  dessen
              Definition zu ermitteln.

       AT_SYMLINK_NOFOLLOW
              Falls Pfadname ein symbolischer Link ist, wird er nicht dereferenziert: Stattdessen
              werden   Informationen   zum   Link  selbst  zurückgegeben,  wie  lstat().  In  der
              Voreinstellung dereferenziert fstatat() symbolische Links, wie auch stat().

       Lesen Sie openat(2) für eine Beschreibung der Notwendigkeit von fstatat().

RÜCKGABEWERT

       Bei Erfolg wird Null zurückgegeben. Bei einem  Fehler  wird  -1  zurückgegeben  und  errno
       entsprechend gesetzt.

FEHLER

       EACCES Der  Suchzugriff  auf  eines  der  Verzeichnisse  im  Pfadpräfix von Pfadname wurde
              verweigert (siehe auch path_resolution(7)).

       EBADF  fd ist falsch.

       EFAULT Ungültige Adresse

       ELOOP  Beim Pfaddurchlauf wurden zu viele symbolische Links gefunden.

       ENAMETOOLONG
              Pfadname ist zu lang.

       ENOENT Eine  Komponente  von  Pfadname  existiert  nicht  oder  Pfadname  ist  die   leere
              Zeichenkette.

       ENOMEM Kein Speicher mehr (das bedeutet Speicher im Kernel).

       ENOTDIR
              Eine Komponente des Pfadpräfixes von Pfadname ist kein Verzeichnis.

       EOVERFLOW
              Pfadname  oder fd bezieht sich auf eine Datei, deren Name, Inode-Anzahl oder Anzahl
              der Blöcke nicht durch die Typen off_t, ino_t oder  blkcnt_t  repräsentiert  werden
              kann.   Dieser   Fehler   kann   beispielsweise  auftreten,  wenn  eine  auf  einer
              32-bit-Plattform kompilierte Anwendung ohne -D_FILE_OFFSET_BITS=64 stat() für  eine
              Datei aufruft, deren Größe (1<<31)-1 Byte übersteigt.

       Die folgenden Fehler können zusätzlichen bei fstatat() auftreten:

       EBADF  dirfd ist kein zulässiger Dateideskriptor.

       EINVAL Unzulässiger Schalter in Schalter angegeben.

       ENOTDIR
              Pfadname  ist  relativ  und  dirfd ist ein Dateideskriptor, der sich auf eine Datei
              statt auf ein Verzeichnis bezieht.

VERSIONEN

       fstatat() wurde zu Linux in Kernel 2.6.16 hinzugefügt; Bibliotheksunterstützung  wurde  zu
       Glibc in Version 2.4 hinzugefügt.

KONFORM ZU

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

       fstatat(): POSIX.1-2008.

       Entsprechend  POSIX.1-2001  benötigt  lstat()  bei  Anwendung  auf einen symbolischen Link
       lediglich im Feld st_size und im Dateityp des  st_mode-Feldes  der  stat-Struktur  gültige
       Rückgabeinformationen.  POSIX.1-2008  engt diese Spezifikation ein, indem lstat() in allen
       Feldern außer den Modus-Bits in st_mode gültige Informationen zurückgeben muss.

       Die Verwendung der Felder st_blocks und st_blksize  kann  die  Portabilität  einschränken.
       Diese  wurden  in  BSD eingeführt. Die Interpretation unterscheidet sich auf verschiedenen
       Systemen, und möglicherweise auf einem einzelnen System, wenn  NFS-Einhängungen  bestehen.
       Falls  Sie  die  Definition  der  Typen blkcnt_t oder blksize_t von <sys/stat.h> ermitteln
       wollen, dann definieren Sie _XOPEN_SOURCE mit einem Wert von 500 oder  größer  (bevor  Sie
       irgendeine Header-Datei einbeziehen).

       POSIX  beschreibt  die  Konstanten  S_IFMT,  S_IFSOCK, S_IFLNK, S_IFREG, S_IFBLK, S_IFDIR,
       S_IFCHR, S_IFIFO, S_ISVTX nicht, sondern verlangt stattdessen  die  Benutzung  der  Makros
       S_ISDIR() etc. Die S_IF*-Konstanten sind in POSIX.1-2001 und neuer vorhanden.

       Die  Makros S_ISLNK() und S_ISSOCK() finden sich nicht in POSIX.1-1996, sind aber beide in
       POSIX.1-2001 vorhanden; ersteres ist aus SVID 4v2, letzteres aus SUSv2.

       UNIX V7 (und später) hat S_IREAD, S_IWRITE, S_IEXEC, wobei  POSIX  die  Synonyme  S_IRUSR,
       S_IWUSR, S_IXUSR vorschreibt.

   Andere Systeme
       Werte die von verschiedenen Systemen benutzt wurden oder werden:

       Hex    name       ls   Oktal    Beschreibung
       f000   S_IFMT          170000   Maske für Dateityp
       0000                   000000   SCO out-of-service inode; BSD unknown type;
                                       SVID-v2 and XPG2 have both 0 and 0100000 for
                                       ordinary file
       1000   S_IFIFO    p|   010000   FIFO (benannte Pipe)
       2000   S_IFCHR    c    020000   zeichenorientierte Spezialdatei (V7)
       3000   S_IFMPC         030000   gemultiplexte zeichenorientierte Spezialdatei (V7)
       4000   S_IFDIR    d/   040000   Verzeichnis (V7)
       5000   S_IFNAM         050000   XENIX named special file with two subtypes,
                                       distinguished by st_rdev values 1, 2
       0001   S_INSEM    s    000001   XENIX Semaphore-Untertyp von IFNAM
       0002   S_INSHD    m    000002   XENIX geteilte-Daten-Untertyp von IFNAM
       6000   S_IFBLK    b    060000   blockorientierte Spezialdatei (V7)
       7000   S_IFMPB         070000   gemultiplexte blockorientierte Spezialdatei (V7)
       8000   S_IFREG    -    100000   regular (V7)
       9000   S_IFCMP         110000   VxFS-komprimiert
       9000   S_IFNWK    n    110000   Netzwerk-Spezialdatei (HP-UX)
       a000   S_IFLNK    l@   120000   symbolischer Link (BSD)
       b000   S_IFSHAD        130000   Solaris shadow inode for ACL (not seen by user
                                       space)
       c000   S_IFSOCK   s=   140000   Socket (BSD; auch »S_IFSOC« auf VxFS)
       d000   S_IFDOOR   D>   150000   Solaris door
       e000   S_IFWHT    w%   160000   BSD-»whiteout« (nicht für Inode benutzt)
       0200   S_ISVTX         001000   »Sticky«-Bit: Text bleibt auf Swap auch nach
                                       Benutzung (V7)
                                       reserviert (SVID-v2)
                                       Auf Nicht-Verzeichnisse: diese Datei nicht
                                       zwischenspeichern (SunOS)
                                       Auf Verzeichnisse: Schalter für eingeschränktes
                                       Löschen (SVID-v4.2)
       0400   S_ISGID         002000   Gruppen-ID bei Ausführung setzen(V7)
                                       Für Verzeichnisse: BSD-Semantik für Weitergeben
                                       der Gruppen-ID benutzen
       0400   S_ENFMT         002000   0400   S_ENFMT                                                   002000SysV
                                       Sperren der Datei erzwungen (gleicher Wert wie
                                       S_ISGID)
       0800   S_ISUID         004000   set-user-ID on execution (V7)
       0800   S_CDF           004000   Verzeichnis ist eine kontextabhängige Datei (HP-UX)

       Ein »sticky«-Befehl tauchte in Version 32V AT&T UNIX auf.

ANMERKUNGEN

       Unter  Linux  löst  lstat() generell keine Automounter-Aktion aus, während stat() dies tut
       (aber siehe fstatat(2)).

       Für die meisten Dateien unterhalb  des  Verzeichnisses  /proc  liefert  stat()  nicht  die
       Dateigröße   im   Feld   st_size  zurück,  stattdessen  wird  das  Feld  mit  dem  Wert  0
       zurückgeliefert.

   Zeitstempelfelder
       Ältere Kernel und ältere Standards unterstützen keine Zeitstempel-Felder für Nanosekunden.
       Stattdessen  gab  es  die  drei  Zeitstempel-Felder  —st_atime,  st_mtime  und  st_ctime—,
       angegeben als time_t, die Zeitstempel mit Sekundengenauigkeit ergaben.

       Seit Kernel 2.5.48 unterstützt die stat-Struktur die Nanosekunden-Auflösung für  die  drei
       Zeitstempel-Felder.  Die  Nanosekunden-Komponenten jedes Zeitstempels sind durch Namen der
       Form  st_atim.tv_nsec  verfügbar,   sofern   das   Feature-Test-Makro   _BSD_SOURCE   oder
       _SVID_SOURCE  definiert  ist.  Nanosekunden-Zeitstempel  sind  heutzutage  standardisiert,
       beginnend mit POSIX.1-2008, und die Glibc bietet seit Version 2.12 ebenfalls die Namen der
       Nanosekunden-Komponenten,  wenn  _POSIX_C_SOURCE  mit  dem  Wert  200809L oder größer oder
       _XOPEN_SOURCE mit dem Wert 700 oder größer  definiert  ist.  Falls  keines  der  erwähnten
       Makros  definiert  ist, dann werden die Nanosekunden-Werte mit Namen der Form st_atimensec
       angezeigt.

       Nanosekunden-Zeitstempel  werden  von  XFS,  JFS,  Btrfs  und  ext4  (seit  Linux  2.6.23)
       unterstützt.   Nanosekunden-Zeitstempel   werden   von   ext2,  ext3  und  Reiserfs  nicht
       unterstützt. Auf Dateisystemen, die für Zeitstempel keine Sekundenbruchteile unterstützen,
       wird für die Nanosekunden-Felder der Wert 0 zurückgegeben.

   Unterschiede C-Bibliothek/Kernel
       Over  time,  increases  in  the  size  of  the stat structure have led to three successive
       versions of stat(): sys_stat()  (slot __NR_oldstat), sys_newstat()  (slot __NR_stat),  and
       sys_stat64()  (slot __NR_stat64)  on 32-bit platforms such as i386. The first two versions
       were already present in Linux 1.0 (albeit with different names); the  last  was  added  in
       Linux 2.4. Similar remarks apply for fstat()  and lstat().

       The  kernel-internal  versions  of the stat structure dealt with by the different versions
       are, respectively:

              __old_kernel_stat
                     The original structure, with rather narrow fields, and no padding.

              stat   Larger st_ino field and padding added to various parts of the  structure  to
                     allow for future expansion.

              stat64 Even larger st_ino field, larger st_uid and st_gid fields to accommodate the
                     Linux-2.4 expansion of UIDs and GIDs to 32 bits, and various other  enlarged
                     fields  and  further  padding  in the structure. (Various padding bytes were
                     eventually consumed in Linux 2.6, with the advent of 32-bit device  IDs  and
                     nanosecond components for the timestamp fields.)

       The  glibc  stat()   wrapper  function hides these details from applications, invoking the
       most recent version of the system call provided by the kernel, and repacking the  returned
       information if required for old binaries.

       On  modern  64-bit  systems, life is simpler: there is a single stat() system call and the
       kernel deals with a stat structure that contains fields of a sufficient size.

       Der der Glibc-Wrapper-Funktion fstatat() zugrunde liegende  Systemaufruf  ist  tatsächlich
       fstatat64() oder auf einigen Architekturen newfstatat().

BEISPIEL

       Das  folgende  Programm  ruft  stat()  auf  zeigt ausgewählte Felder der zurückgelieferten
       Struktur stat an.

       #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, "Aufruf: %s <Pfadname>\n", argv[0]);
               exit(EXIT_FAILURE);
           }

           if (stat(argv[1], &sb) == -1) {
               perror("stat");
               exit(EXIT_FAILURE);
           }

           printf("Dateityp:                 ");

           switch (sb.st_mode & S_IFMT) {
           case S_IFBLK:  printf("blockorientiertes Gerät\n");   break;
           case S_IFCHR:  printf("zeichenorientiertes Gerät\n"); break;
           case S_IFDIR:  printf("Verzeichnis\n");               break;
           case S_IFIFO:  printf("FIFO/Pipe\n");                 break;
           case S_IFLNK:  printf("symbolischer Link\n");         break;
           case S_IFREG:  printf("reguläre Datei\n");            break;
           case S_IFSOCK: printf("Socket\n");                    break;
           default:       printf("unbekannt?\n");                break;
           }

           printf("I-node number:            %ld\n", (long) sb.st_ino);

           printf("Modus:                    %lo (oktal)\n",
                   (unsigned long) sb.st_mode);

           printf("Link count:               %ld\n", (long) sb.st_nlink);
           printf("Ownership:                UID=%ld   GID=%ld\n",
                   (long) sb.st_uid, (long) sb.st_gid);

           printf("Preferred I/O block size: %ld bytes\n",
                   (long) sb.st_blksize);
           printf("File size:                %lld bytes\n",
                   (long long) sb.st_size);
           printf("Blocks allocated:         %lld\n",
                   (long long) sb.st_blocks);

           printf("Letzte Statusänderung:    %s", ctime(&sb.st_ctime));
           printf("Letzter Dateizugriff:     %s", ctime(&sb.st_atime));
           printf("Letzte Dateiänderung:     %s", ctime(&sb.st_mtime));

           exit(EXIT_SUCCESS);
       }

SIEHE AUCH

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

KOLOPHON

       Diese  Seite  ist  Teil  der  Veröffentlichung  4.04  des  Projekts  Linux-man-pages. Eine
       Beschreibung des Projekts, Informationen, wie Fehler  gemeldet  werden  können  sowie  die
       aktuelle Version dieser Seite finden sich unter http://www.kernel.org/doc/man-pages/.

ÜBERSETZUNG

       Die  deutsche  Übersetzung  dieser  Handbuchseite  wurde von Jonas Rovan <jonas@blitz.de>,
       Martin Schulze <joey@infodrom.org>, Michael Piefel <piefel@debian.org>,  Helge  Kreutzmann
       <debian@helgefjell.de> und Mario Blättermann <mario.blaettermann@gmail.com> erstellt.

       Diese  Übersetzung  ist  Freie  Dokumentation;  lesen  Sie  die GNU General Public License
       Version  3  oder  neuer  bezüglich  der  Copyright-Bedingungen.  Es  wird  KEINE   HAFTUNG
       übernommen.

       Wenn Sie Fehler in der Übersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-
       Mail an <debian-l10n-german@lists.debian.org>.