Provided by: manpages-de-dev_4.21.0-2_all bug

BEZEICHNUNG

       stat, fstat, lstat, fstatat - Dateistatus ermitteln

BIBLIOTHEK

       Standard-C-Bibliothek (libc, -lc)

ÜBERSICHT

       #include <sys/stat.h>

       int stat(const char *restrict Pfadname,
                struct stat *restrict Statuspuffer);
       int fstat(int dd, struct stat *Statuspuffer);
       int lstat(const char *restrict Pfadname,
                struct stat *restrict Statuspuffer);

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

       int fstatat(int Verzdd, const char *restrict Pfadname,
                struct stat *restrict Statuspuffer, int Schalter);

   Mit Glibc erforderliche Feature-Test-Makros (siehe feature_test_macros(7)):

       lstat():
           /* Seit Glibc 2.20 */ _DEFAULT_SOURCE
               || _XOPEN_SOURCE >= 500
               || /* Seit Glibc 2.10: */ _POSIX_C_SOURCE >= 200112L
               || /* Glibc 2.19 und älter */ _BSD_SOURCE

       fstatat():
           Seit Glibc 2.10:
               _POSIX_C_SOURCE >= 200809L
           Vor Glibc 2.10:
               _ATFILE_SOURCE

BESCHREIBUNG

       Diese   Funktionen  geben  Informationen  über  eine  Datei  im  Puffer  zurück,  auf  den
       Statuspuffer 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 dd angegeben wird.

   Die Struktur stat
       Alle diese Systemaufrufe geben eine Struktur stat zurück, siehe stat(3type)).

       Hinweis:  Zur Leistungsverbesserung und aus Einfachheitsgründen können verschiedene Felder
       in der Struktur stat  Zustandsinformationen  von  verschiedenen  Zeitpunkten  während  der
       Ausführung  des Systemaufrufs enthalten. Wird beispielsweise st_mode oder st_uid von einem
       anderen Prozess während der Ausführung des Systemaufrufs durch Aufruf  von  chmod(2)  oder
       chown(2) geändert, dann könnte stat() den alten st_mode zusammen mit dem neuen st_uid oder
       den alten st_uid zusammen mit dem neuen st_mode zurückliefern.

   fstatat()
       Der  Systemaufruf  fstatat()  ist  eine  allgemeinere  Schnittstelle   zum   Zugriff   auf
       Dateiinformationen, die immer noch das gleiche Verhalten wie einer aus stat(), lstat() und
       fstat() bereitstellen kann.

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

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

       Falls Pfadname absolut ist, wird Verzdd 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
              Verzdd  verweist  (dies kann mit dem O_PATH-Schalter von open(2) ermittelt werden).
              In diesem Fall kann sich Verzdd  auf  jeden  Dateityp  beziehen,  nicht  nur  einem
              Verzeichnis  und  das Verhalten von fstatat() ist ähnlich zu dem von fstat(). Falls
              Verzdd AT_FDCWD ist, erfolgt der Aufruf  im  aktuellen  Arbeitsverzeichnis.  Dieser
              Schalter  ist Linux-spezifisch; definieren Sie _GNU_SOURCE, um dessen Definition zu
              ermitteln.

       AT_NO_AUTOMOUNT (seit Linux 2.6.38)
              Die Terminal- (»Basisnamen«-)Komponente von Pfadname nicht  automatisch  einhängen.
              Seit Linux 3.1 wird dieser Schalter ignoriert. Seit Linux 4.11 wird dieser Schalter
              impliziert.

       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
       gesetzt, um den Fehler anzuzeigen.

FEHLER

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

       EBADF  dd ist kein zulässiger offener Dateideskriptor.

       EBADF  (fstatat())  Der Pfadname ist relativ, aber Verzdd  ist  weder  AT_FDCWD  noch  ein
              gültiger Dateideskriptor.

       EFAULT Ungültige Adresse.

       EINVAL (fstatat())  Unzulässiger Schalter in Schalter angegeben.

       ELOOP  Beim Pfaddurchlauf wurden zu viele symbolische Links gefunden.

       ENAMETOOLONG
              Pfadname ist zu lang.

       ENOENT Eine Komponente von Pfadname existiert nicht oder ist ein toter symbolischer Link.

       ENOENT Pfadname  ist  die  leere  Zeichenkette  und  AT_EMPTY_PATH wurde in Schalter nicht
              angegeben.

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

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

       ENOTDIR
              (fstatat())  Pfadname ist relativ und Verzdd ist ein Dateideskriptor, der sich  auf
              eine Datei bezieht, die kein Verzeichnis ist.

       EOVERFLOW
              Pfadname  oder dd 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.

VERSIONEN

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

STANDARDS

       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.

ANMERKUNGEN

   Unterschiede C-Bibliothek/Kernel
       Mit der Zeit führte der Größenzuwachs der stat-Struktur auf 32-Bit-Plattformen wie i386 zu
       drei Folgeversionen  von  stat():  sys_stat()  (slot  __NR_oldstat),  sys_newstat()  (slot
       __NR_stat) und sys_stat64() (slot __NR_stat64). Die ersten zwei Versionen waren bereits in
       Linux 1.0. (allerdings mit anderen  Namen)  verfügbar;  die  letzte  wurde  in  Linux  2.4
       hinzugefügt. Ähnliches gilt für fstat() und lstat().

       Die  kernelinterne  Version  der  Struktur  stat handhabte drei verschieden Versionen, und
       zwar:

       __old_kernel_stat
              Die ursprüngliche Struktur, mit eher engen Felder und keiner Auffüllung.

       stat   Größeres Feld st_ino mit ergänzter Auffüllung an verschiedenen Teilen der Struktur,
              um zukünftige Erweiterungen zu erlauben.

       stat64 Noch   größeres   Feld   st_ino,   größere   Felder   st_uid  und  st_gid,  um  der
              Linux-2.4-Erweiterung der  UIDs  und  GIDs  auf  32  bit  Platz  zu  schaffen,  und
              verschiedene  andere  vergrößerte  Felder und weitere Auffüllungen in der Struktur.
              (Verschiedene Auffüllbytes wurden schließlich in Linux 2.6 mit  dem  Aufkommen  von
              32-bit-Gerätekennungen und Nanosekundenkomponenten der Zeitstempelfelder benutzt.)

       Die Wrapperfunktion der Glibc stat() versteckt diese Details vor Anwendungen. Sie ruft die
       neuste  Version  des  vom  Kernel  bereitgestellten  Systemaufrufs  auf  und   packt   die
       zurückgelieferten Informationen neu, falls dies für alte Programme benötigt wird.

       Auf  modernen 64-Bit-Systemen ist das Leben einfacher: Es gibt einen einzigen Systemaufruf
       stat() und der Kernel arbeitet mit einer Struktur stat,  die  Felder  einer  ausreichenden
       Größe enthält.

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

BEISPIELE

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

       #include <stdint.h>
       #include <stdio.h>
       #include <stdlib.h>
       #include <sys/stat.h>
       #include <sys/sysmacros.h>
       #include <time.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 (lstat(argv[1], &sb) == -1) {
               perror("lstat");
               exit(EXIT_FAILURE);
           }

           printf("Kennung des enthaltenen Gerätes:  [%x,%x]\n",
                  major(sb.st_dev),
                  minor(sb.st_dev));

           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-Nummer:            %ju\n", (uintmax_t) sb.st_ino);

           printf("Modus:                    %jo (oktal)\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("Preferred I/O block size: %jd bytes\n",
                  (intmax_t) sb.st_blksize);
           printf("File size:                %jd bytes\n",
                  (intmax_t) sb.st_size);
           printf("Blocks allocated:         %jd\n",
                  (intmax_t) 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),  statx(2),  utime(2),
       stat(3type), capabilities(7), inode(7), symlink(7)

ÜBERSETZUNG

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

       Diese Übersetzung ist Freie Dokumentation;  lesen  Sie  die  GNU  General  Public  License
       Version  3 ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩ 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 die Mailingliste der Übersetzer ⟨debian-l10n-german@lists.debian.org⟩.