plucky (2) fstatat.2.gz

Provided by: manpages-de-dev_4.25.1-1_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.

STANDARDS

       POSIX.1-2008.

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 <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("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⟩.