STAT (Systemanruf)

Stat Befehlszeile

stat () ist ein Unix Systemanruf Das kehrt zurück Dateiattribute Über ein Inode. Die Semantik von stat () variieren zwischen Betriebssysteme. Als Beispiel, Unix Befehl ls Verwendet diesen Systemaufruf, um Informationen zu Dateien abzurufen, die enthält:

  • Atime: Zeit des letzten Zugangs ( ls -lu)
  • mtime: Zeit der letzten Änderung ( ls -l)
  • CTime: Zeit des letzten Statusänderung ( ls -lc)

Stat erschien in Version 1 Unix. Es gehört zu den wenigen ursprünglichen Unix Systemaufrufe sich ändern, mit Version 4's Zugabe von Gruppenberechtigungen und größer Dateigröße.[1]

stat () Funktionen

Das C POSIX -Bibliothek Header sys/stat.h, gefunden auf Posix und andere Unix-artig Betriebssysteme, erklärt die stat () Funktionen sowie verwandte Funktionen genannt fstat () und lstat (). Die Funktionen nehmen a strukturstat Pufferargument, mit dem die Dateiattribute zurückgegeben werden. Bei Erfolg gibt die Funktionen Null zurück und bei Fehler wird –1 zurückgegeben und Errno ist angemessen eingestellt.

Das stat () und lstat () Funktionen nehmen a Dateiname Streit. Wenn die Datei a ist symbolischer Link, stat () Gibt Attribute des späteren Ziels des Links zurück lstat () Gibt Attribute des Links selbst zurück. Das fstat () Funktion nimmt a Dateideskriptor Argument stattdessen und gibt Attribute der Datei zurück, die sie identifiziert.

Die Funktionsfamilie wurde auf die Implementierung erweitert Große Dateiunterstützung. Funktionen benannt Stat64 (), lstat64 () und fstat64 () Rückgabeattribute in a Struct Stat64 Struktur, die Dateigrößen mit einem 64-Bit-Typ darstellt, sodass die Funktionen auf Dateien 2 Gib und größer arbeiten können (bis zu 8 EIB). Wenn der _File_offset_bits Makro Es ist auf 64 definiert, diese 64-Bit-Funktionen sind unter den ursprünglichen Namen erhältlich.

Die Funktionen sind definiert als:

int Stat(Const verkohlen *Dateiname, Struktur Stat *buf); int lstat(Const verkohlen *Dateiname, Struktur Stat *buf); int fstat(int gefragt, Struktur Stat *buf); 

Stat -Struktur

Diese Struktur ist in definiert in sys/stat.h Header -Datei wie folgt, obwohl Implementierungen zusätzliche Felder definieren können:[2]

Struktur Stat { 	modus_t			ST_MODE; 	ich nicht			st_ino; 	dev_t			ST_DEV; 	dev_t			ST_RDEV; 	nlink_t			st_nlink; 	uid_t			ST_UID; 	gid_t			ST_GID; 	off_t			ST_SIZE; 	Struktur Timesspec	st_atim; 	Struktur Timesspec	st_mtim; 	Struktur Timesspec ST_CTIM; 	BlkSize_T		ST_BLKSIZE; 	BLKCNT_T		st_blocks; }; 

POSIX.1 erfordert nicht ST_RDEV, st_blocks und ST_BLKSIZE Mitglieder; Diese Felder sind in der Einzel -UNIX -Spezifikation als Teil der XSI -Option definiert.

In älteren Versionen von POSIX.1 Standard wurden die zeitbezogenen Felder definiert als st_atime, st_mtime und st_ctimeund waren vom Typ time_t. Seit der Version 2008 des Standards wurden diese Felder umbenannt st_atim, st_mtim und ST_CTIMjeweils der Typstruktur TimesspecDa diese Struktur eine Zeiteinheit mit höherer Auflösung bietet. Um der Kompatibilität willen können Implementierungen die alten Namen in Bezug auf die definieren TV_SEC Mitglied von Struct Timesspec. Zum Beispiel, st_atime kann definiert werden als st_atim.tv_sec.[2]

Das strukturstat Die Struktur umfasst mindestens folgende Mitglieder:

  • ST_DEV- Kennung von Gerät Enthaltende Datei
  • st_ino- - Inode Nummer
  • ST_MODE- Schutz Modus; siehe auch UNIX -Berechtigungen
  • st_nlink- - Referenzzahl von harte Links
  • ST_UID- - Benutzerkennung des Eigentümers
  • ST_GID- - Gruppenkennung des Eigentümers
  • ST_RDEV- Gerätekennung (wenn Sonderdatei)
  • ST_SIZE- Gesamt Dateigröße, in Bytes
  • st_atime- Zeit des letzten Zugangs
  • st_mtime- Zeit der letzten Änderung
  • st_ctime- Zeit der letzten Statusänderung
  • ST_BLKSIZE- bevorzugt Block Größe für das Dateisystem I/O, der sowohl vom System als auch vom Typ des Dateisystems abhängen kann[3]
  • st_blocks- Anzahl der Blöcke, die in Vielfachen von zugewiesen wurden Dev_bsize (normalerweise 512 Bytes).

Das ST_MODE Feld ist a Bitfeld. Es kombiniert den Dateizugriff Modi und zeigt auch alle an Sonderdateityp. Es gibt viele Makros, die mit den verschiedenen Modus -Flags und Dateitypen arbeiten.

Kritik an Atime

Das Lesen einer Datei ändert seine eine Zeit Schließlich eine Festplatte benötigen schreiben, Dies wurde kritisiert, da es nicht mit einem LEAD -Dateisystem nicht abhängt. Das Dateisystem -Cache kann diese Aktivität erheblich auf eine Festplatte pro Cache -Flush reduzieren.

Linux Kernel Entwickler Ingo Molnár öffentlich kritisierte das Konzept und die Leistung von Atime im Jahr 2007,[4][5] und im Jahr 2009 die Relatime Die Mount -Option war zum Standard geworden, der sich mit dieser Kritik befasst.[6] Das Verhalten hinter dem Relatime Die Mount -Option bietet für die meisten Zwecke eine ausreichende Leistung und sollte keine wesentlichen Anwendungen brechen, wie sie ausgiebig diskutiert wurde.[7] Anfänglich, Relatime Nur aktualisierte Atime, wenn Atime <mtime oder ath <cTime; Das wurde anschließend geändert, um ältere, die 24 Stunden oder älter waren, damit das so tmpwatch und Debians Popularity Counter (POPCON) würde sich richtig verhalten.[8]

Aktuelle Versionen des Linux -Kernels unterstützen vier Mount -Optionen, die in angegeben werden können fstab:

  • streng (früher eine Zeitund früher der Standard; streng Ab 2.6.30) - Aktualisieren Sie immer Atime, das dem durch POSIX definierten Verhalten entspricht
  • Relatime ("Relative Atime", eingeführt in 2.6.20 und der Ausfall von 2,6.30) - nur unter bestimmten Umständen aktualisieren vorbei an
  • nodiratime- Aktualisieren Sie niemals den Verzeichnis, sondern aktualisieren Sie die Atime anderer Dateien
  • Noatime- Aktualisieren Sie niemals eine Datei oder Verzeichnis; impliziert nodiratime; höchste Leistung, aber am wenigsten kompatibel
  • Freizeit- Aktualisieren Sie den nachstehend festgelegten Zeitpunkt nach bestimmten Umständen

Aktuelle Versionen von Linux, Mac OS, Solaris, Freebsd, und Netbsd Unterstützung a Noatime Mount -Option in /etc/fstab, was dazu führt, dass das Gebiet Feld niemals aktualisiert wird. Ausschalten von älteren Updating -Pausen Posix Compliance und einige Anwendungen, wie z. mbox-Driven "neu Post"Benachrichtigungen,[9] und einige Dateinutzungsversuche, insbesondere TMPWatch.

Das Noatime Option auf OpenBSD verhält sich eher wie Linux Relatime.[10]

Version 4.0 der Linux -Kernel -Hauptlinie, das am 12. April 2015 veröffentlicht wurde, stellte die neue Mount -Option vor Freizeit. Es ermöglicht die Ausführung von POSIX-Stil-Updates, die in Memory durchgeführt und zusammen mit einigen nicht zeitbezogenen E/A-Operationen in derselben Datei gespült werden. Atime -Updates werden ebenfalls auf Scheibe gespült, wenn einige der Synchronisation Systemaufrufe werden ausgeführt oder bevor der In-Memory-Inode der Datei aus dem Dateisystem-Cache vertrieben wird. Darüber hinaus ist es möglich, zu konfigurieren, wie lange Zeitmodifikationen nicht verleumdet bleiben können. Auf diese Weise behält LazyTime die POSIX -Kompatibilität bei und bietet gleichzeitig Leistungsverbesserungen.[11][12]

CTime

Es ist verlockend zu glauben CTime ursprünglich bedeutete die Schöpfungszeit;[13] Obwohl die frühe Unix Änderungs- und Erstellungszeiten hatte, wurde letzteres geändert, um die Zugriffszeit zu sein CTime. Die Dateisysteme behielten nur die Zugriffszeit (eine Zeit) und Änderungszeit (mtime) bis 6. Ausgabe Unix. Das CTime Der Zeitstempel wurde in der Umstrukturierung des Dateisystems hinzugefügt, die bei der 7. Ausgabe Unix auftrat, und hat sich immer auf die Zeit der Inode -Änderungszeit verwiesen. Es wird jederzeit aktualisiert, die Dateimetadaten, die in den Inode -Änderungen gespeichert sind, wie z. Dateiberechtigungen, FILDE ARTERSION, und Schöpfung und Löschen von harten Links. In einigen Implementierungen, CTime wird durch die Umbenennung einer Datei betroffen: beide Original -UNIX, die eine Umbenennung durch Erstellen eines Links implementiert haben (Aktualisierung CTime) und dann den alten Namen zu verlieren (Aktualisierung CTime wieder) und moderne Linux neigen dazu, dies zu tun.

nicht wie eine Zeit und mtime, CTime kann nicht auf einen willkürlichen Wert eingestellt werden mit utime (), wie von der verwendet berühren Nützlichkeit zum Beispiel. Stattdessen wann utime () wird verwendet oder für eine andere Änderung des Inode der Inode als eine Aktualisierung zu eine Zeit verursacht durch Zugriff auf die Datei, die CTime Der Wert wird auf die aktuelle Zeit eingestellt.

Zeit Granularität

  • time_t Bietet Zeiten genau auf eine Sekunde.
  • Einige Dateisysteme bieten eine feinere Granularität. Solaris 2.1 führte 1992 eine Mikrosekundenauflösung mit UFS und eine Nanosekundenauflösung mit ZFS ein.
  • In Linux -Kerneln 2.5.48 und höher unterstützt die STAT -Struktur die Auflösung der Nanosekunden für die drei Datei -Zeitstempelfelder. Diese werden als zusätzliche Felder in der STAT -Struktur aufgedeckt.[14][15]
  • Die Lösung der Erstellung von Zeit auf Fettes Dateisystem IS 10 Millisekunden, während die Lösung seiner Schreibzeit zwei Sekunden beträgt, und die Zugriffszeit hat eine Auflösung von einem Tag, daher fungiert sie als Zugriffsdatum.[16]

Beispiel

#enthalten  #enthalten  #enthalten  #enthalten  #enthalten  #enthalten  #enthalten  int hauptsächlich(int argc, verkohlen *argv[]) { 	Struktur Stat sb; 	Struktur Passwd *Pwuser; 	Struktur Gruppe *Grpnam; 	wenn (argc < 2) 	{ 		fprintf(Stderr, "Nutzung: %s: Datei ...\n", argv[0]); 		Ausfahrt(Exit_failure); 	} 	zum (int i = 1; i < argc; i++) 	{ 		wenn (-1 == Stat(argv[i], &sb)) 		{ 			Perror("stat ()"); 			Ausfahrt(Exit_failure); 		} 		wenn (NULL == (Pwuser = Getpwuid(sb.ST_UID))) 		{ 			Perror("Getpwuid ()"); 			Ausfahrt(Exit_failure); 		} 		wenn (NULL == (Grpnam = Getgrgid(sb.ST_GID))) 		{ 			Perror("Getgrgid ()"); 			Ausfahrt(Exit_failure); 		} 		printf("%s:\n", argv[i]); 		printf("\tInode: %u\n", sb.st_ino); 		printf("\tEigentümer: %U ( %s)\n", sb.ST_UID, Pwuser->PW_NAME); 		printf("\tGruppe: %U ( %s)\n", sb.ST_GID, Grpnam->Gr_Name); 		printf("\tPerms: %o\n", sb.ST_MODE & (S_irwxu | S_irwxg | S_irwxo)); 		printf("\tLinks: %d\n", sb.st_nlink); 		printf("\tGröße: %ld\n", sb.ST_SIZE); / * Sie können %LLD verwenden */ 		printf("\tAtime: %s ", CTime(&sb.st_atim.TV_SEC)); 		printf("\tmtime: %s ", CTime(&sb.st_mtim.TV_SEC)); 		printf("\tCTime: %s ", CTime(&sb.ST_CTIM.TV_SEC)); 		printf("\n"); 	} 	Rückkehr 0; } 

Verweise

  1. ^ McIlroy, M. D. (1987). A Research Unix Reader: Annotierte Auszüge aus dem Programmierhandbuch, 1971–1986 (PDF) (Technischer Bericht). Cstr. Bell Labs. 139.
  2. ^ a b Stevens & Rago 2013, p. 94.
  3. ^ "<sys/stat.h>". Die offenen Gruppenbasisspezifikationen Ausgabe 6 - IEE STD 1003.1, 2004 Ausgabe. Die offene Gruppe. 2004.
  4. ^ Kernelfalle: Linux: Ersetzen von Atime durch Relatime, von Jeremy, 7. August 2007
  5. ^ Es war einmal, LWN, von Jonathan Corbet, 8. August 2007
  6. ^ Linux -Kernel 2.6.30, Linux -Kernel -Neulinge
  7. ^ Dieser massive Dateisystem -Thread, LWN, von Jonathan Corbet, 31. März 2009
  8. ^ Relatime Recap, Valerie Aurora
  9. ^ http://www.mail-archive.com/[email protected]/msg24912.html "Der $ Mail -Monitor der Shell ... hängt von der Zeit ab, die neue E -Mails mit arm ($ mail) <mtime ($ mail) ausspricht"
  10. ^ "Mount (2) - OpenBSD -Handbuchseiten". openbsd.org. 27. April 2018. Abgerufen 26. September, 2018.
  11. ^ "Linux Kernel 4.0, Abschnitt 1.5. 'Lazytime' Option für eine bessere Aktualisierung von Dateizeitstempeln". kernelnewbies.org. 1. Mai 2015. Abgerufen 2. Mai, 2015.
  12. ^ Jonathan Corbet (19. November 2014). "Lazytime einführen". Lwn.net. Abgerufen 2. Mai, 2015.
  13. ^ "BSTJ -Version von C.ACM Unix Paper".
  14. ^ "STAT (2) - Linux Manual Page". Man7.org. Abgerufen 27. Februar, 2015.
  15. ^ Andreas Jaeger (2. Dezember 2002), struct stat.h mit Nanosekundenauflösung, Mail-Archiv der [email protected] Mailingliste für das GLIBC-Projekt.
  16. ^ MSDN: Dateizeiten

Externe Links