stat(2) System Calls Manual stat(2) BEZEICHNUNG stat, fstat, lstat, fstatat - Dateistatus ermitteln BIBLIOTHEK Standard-C-Bibliothek (libc, -lc) UBERSICHT #include 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 /* Definition der AT_*-Konstanten */ #include 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 alter */ _BSD_SOURCE fstatat(): Seit Glibc 2.10: _POSIX_C_SOURCE >= 200809L Vor Glibc 2.10: _ATFILE_SOURCE BESCHREIBUNG Diese Funktionen geben Informationen uber eine Datei im Puffer zuruck, auf den Statuspuffer zeigt. Dazu werden keinerlei Rechte an der angegebenen Datei benotigt, aber - im Falle von stat(), fstatat() und lstat() - mussen alle Verzeichnisse im Pfadnamen, der zu der Datei fuhrt, durchsucht werden durfen. stat() und fstatat() liefern die Informationen zu der in Pfadname angegebenen Datei und ubergibt diese an fstatat(), wie nachfolgend beschrieben. lstat() ist ahnlich stat(), nur dass falls Pfadname ein symbolischer Link ist, Informationen zum Link zuruckgegeben werden und nicht zur Datei, auf die der Link zeigt. fstat ist ahnlich stat, ausser 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 zuruck, siehe stat(3type)). Hinweis: Zur Leistungsverbesserung und aus Einfachheitsgrunden konnen verschiedene Felder in der Struktur stat Zustandsinformationen von verschiedenen Zeitpunkten wahrend der Ausfuhrung des Systemaufrufs enthalten. Wird beispielsweise st_mode oder st_uid von einem anderen Prozess wahrend der Ausfuhrung des Systemaufrufs durch Aufruf von chmod(2) oder chown(2) geandert, dann konnte stat() den alten st_mode zusammen mit dem neuen st_uid oder den alten st_uid zusammen mit dem neuen st_mode zuruckliefern. 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 ubergebene 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() fur 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 ahnlich 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 einhangen. 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 zuruckgegeben, wie lstat(). In der Voreinstellung dereferenziert fstatat() symbolische Links, wie auch stat(). Lesen Sie openat(2) fur eine Beschreibung der Notwendigkeit von fstatat(). RUCKGABEWERT Bei Erfolg wird Null zuruckgegeben. Bei einem Fehler wird -1 zuruckgegeben und errno gesetzt, um den Fehler anzuzeigen. FEHLER EACCES Der Suchzugriff auf eines der Verzeichnisse im Pfadprafix von Pfadname wurde verweigert (siehe auch path_resolution(7)). EBADF dd ist kein zulassiger offener Dateideskriptor. EBADF (fstatat()) Der Pfadname ist relativ, aber Verzdd ist weder AT_FDCWD noch ein gultiger Dateideskriptor. EFAULT Ungultige Adresse. EINVAL (fstatat()) Unzulassiger 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 Pfadprafixes 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 Blocke nicht durch die Typen off_t, ino_t oder blkcnt_t reprasentiert werden kann. Dieser Fehler kann beispielsweise auftreten, wenn eine auf einer 32-bit-Plattform kompilierte Anwendung ohne -D_FILE_OFFSET_BITS=64 stat() fur eine Datei aufruft, deren Grosse (1<<31)-1 Byte ubersteigt. 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 benotigt lstat() bei Anwendung auf einen symbolischen Link lediglich im Feld st_size und im Dateityp des st_mode-Feldes der stat-Struktur gultige Ruckgabeinformationen. POSIX.1-2008 engt diese Spezifikation ein, indem lstat() in allen Feldern ausser den Modus-Bits in st_mode gultige Informationen zuruckgeben muss. Die Verwendung der Felder st_blocks und st_blksize kann die Portabilitat einschranken. Diese wurden in BSD eingefuhrt. Die Interpretation unterscheidet sich auf verschiedenen Systemen, und moglicherweise auf einem einzelnen System, wenn NFS-Einhangungen bestehen. Unterschiede C-Bibliothek/Kernel Mit der Zeit fuhrte der Grossenzuwachs 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) verfugbar; die letzte wurde in Linux 2.4 hinzugefugt. Ahnliches gilt fur fstat() und lstat(). Die kernelinterne Version der Struktur stat handhabte drei verschieden Versionen, und zwar: __old_kernel_stat Die ursprungliche Struktur, mit eher engen Felder und keiner Auffullung. stat Grosseres Feld st_ino mit erganzter Auffullung an verschiedenen Teilen der Struktur, um zukunftige Erweiterungen zu erlauben. stat64 Noch grosseres Feld st_ino, grossere 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 vergrosserte Felder und weitere Auffullungen in der Struktur. (Verschiedene Auffullbytes wurden schliesslich in Linux 2.6 mit dem Aufkommen von 32-bit-Geratekennungen 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 zuruckgelieferten Informationen neu, falls dies fur alte Programme benotigt 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 Grosse enthalt. Der der Glibc-Wrapper-Funktion fstatat() zugrunde liegende Systemaufruf ist tatsachlich fstatat64() oder auf einigen Architekturen newfstatat(). BEISPIELE Das folgende Programm ruft lstat() auf zeigt ausgewahlte Felder der zuruckgelieferten Struktur stat an. #include #include #include #include #include #include int main(int argc, char *argv[]) { struct stat sb; if (argc != 2) { fprintf(stderr, "Usage: %s \n", argv[0]); exit(EXIT_FAILURE); } if (lstat(argv[1], &sb) == -1) { perror("lstat"); exit(EXIT_FAILURE); } printf("ID of containing device: [%x,%x]\n", major(sb.st_dev), minor(sb.st_dev)); printf("File type: "); switch (sb.st_mode & S_IFMT) { case S_IFBLK: printf("block device\n"); break; case S_IFCHR: printf("character device\n"); break; case S_IFDIR: printf("directory\n"); break; case S_IFIFO: printf("FIFO/pipe\n"); break; case S_IFLNK: printf("symlink\n"); break; case S_IFREG: printf("regular file\n"); break; case S_IFSOCK: printf("socket\n"); break; default: printf("unknown?\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("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("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) UBERSETZUNG Die deutsche Ubersetzung dieser Handbuchseite wurde von Jonas Rovan , Martin Schulze , Michael Piefel , Mario Blattermann und Helge Kreutzmann erstellt. Diese Ubersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3 oder neuer bezuglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG ubernommen. Wenn Sie Fehler in der Ubersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an die Mailingliste der Ubersetzer . Linux man-pages 6.06 31. Oktober 2023 stat(2)