stat(2)

BEZEICHNUNG
stat, fstat, lstat, fstatat - Dateistatus ermitteln

BIBLIOTHEK
Standard-C-Bibliothek (libc, -lc)

ÜBERSICHT
#include <sys/stat.h>

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

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

int fstatat(int Verzdd, const char *restrict Pfad,
         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 Pfad, die zu der Datei führen, durchsucht werden dürfen.

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

lstat() ist ähnlich stat(), nur dass falls Pfad 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 Pfad 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 Pfad relativ ist und Verzdd den besonderen Wert AT_FDCWD annimmt, wird Pfad als relativ zum aktuellen Arbeitsverzeichnis des aufrufenden Prozesses interpretiert (wie stat() und lstat()).

Falls Pfad 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 Pfad eine leere Zeichenkette (oder NULL, seit Linux 6.11) 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 Pfad nicht automatisch einhängen. Seit Linux 3.1 wird dieser Schalter ignoriert. Seit Linux 4.11 wird dieser Schalter impliziert.

AT_SYMLINK_NOFOLLOW
    Falls Pfad 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 Pfad wurde verweigert (siehe auch path_resolution(7)).

EBADF
    dd ist kein zulässiger offener Dateideskriptor.

EBADF
    (fstatat()) Der Pfad 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
    Pfad ist zu lang.

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

ENOENT
    Pfad 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 Pfad ist kein Verzeichnis.

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

EOVERFLOW
    Pfad 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.

STANDARDS
POSIX.1-2024.

GESCHICHTE

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

fstatat()
    POSIX.1-2008. Linux 2.6.16, Glibc 2.4.

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.

  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 <Pfad>\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("File type:                ");

        switch (sb.st_mode & S_IFMT) {
        case S_IFBLK:  printf("Blockgerä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("Symlink\n");                    break;
        case S_IFREG:  printf("reguläre Datei\n");             break;
        case S_IFSOCK: printf("Socket\en");                    break;
        default:       printf("unbekannt?\n");                 break;
        }

        printf("I-node-Nummmer:           %ju\n", (uintmax_t) sb.st_ino);

        printf("Modus:                    %jo (octal)\n",
               (uintmax_t) sb.st_mode);

        printf("Linkzähler:               %ju\n", (uintmax_t) sb.st_nlink);
        printf("Eigentümer:               UID=%ju   GID=%ju\n",
               (uintmax_t) sb.st_uid, (uintmax_t) sb.st_gid);

        printf("Bevorzugte E/A-Blockgräße: %jd byte\n",
               (intmax_t) sb.st_blksize);
        printf("Dateigröße:                %jd byte\n",
               (intmax_t) sb.st_size);
        printf("Reservierte Blöcke:        %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);
    }

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.