Bug in stat()?
pl
- php
3 Matthias Apsel0 TS0 TS- php
- programmiertechnik
0 pl
ctime == mtime ? kann gar nicht sein. Is Bug?
PHPv5.3
MFG
Hallo pl,
http://linux-club.de/wiki/opensuse/Zeitstempel_von_Dateien
Bis demnächst
Matthias
Hallo Matthias,
Fälschlicher Weise wird ctime oftmals mit Create Time übersetzt und somit herrscht über diesen Zeitstempel oftmals eine ganz falsche Vorstellung. Mit diesem Zeitstempel wird die Zeit gespeichert, zu welcher das letzte Mal die Daten innerhalb des Inodes geändert worden sind.
Oh, das ist mir auch neu gewesen. Interessant.
Freundliche Grüße,
Christian Kruse
Hello,
ctime == mtime ? kann gar nicht sein. Is Bug?
PHPv5.3
Wie ist denn das Device gemounted?
vielleicht mit no-atime
?
Das wäre der übliche Standard.
Deshalb muss man Session-Lesezugriffe in PHP immer mindestens mit einem Dummy-Schreibvorgang bestücken, wenn man nicht will, dass die Session mittendrin stirbt.
Glück Auf
Tom vom Berg
Hallo TS,
ctime == mtime ? kann gar nicht sein.
Klar kann das sein.
Is Bug?
Unwahrscheinlich. Ist nur ein Wrapper um den System Call. Vermutlich hast du eher etwas übersehen.
Wie ist denn das Device gemounted?
vielleicht mitno-atime
?
Das wäre der übliche Standard.
noatime
ist access time, nicht modification (mtime) oder creation time (ctime). ctime und mtime unterscheiden sich auch bei Dateisystemen, die mit noatime
gemountet wurden.
Freundliche Grüße,
Christian Kruse
Hello,
Hallo TS,
ctime == mtime ? kann gar nicht sein.
Klar kann das sein.
Is Bug?
Unwahrscheinlich. Ist nur ein Wrapper um den System Call. Vermutlich hast du eher etwas übersehen.
Wie ist denn das Device gemounted?
vielleicht mitno-atime
?
Das wäre der übliche Standard.
noatime
ist access time, nicht modification (mtime) oder creation time (ctime). ctime und mtime unterscheiden sich auch bei Dateisystemen, die mitnoatime
gemountet wurden.
Aber sie können auch gleich sein.
Und anstelle von atime wird dann auch ctime angezeigt.
Glück Auf
Tom vom Berg
Hallo TS,
noatime
ist access time, nicht modification (mtime) oder creation time (ctime). ctime und mtime unterscheiden sich auch bei Dateisystemen, die mitnoatime
gemountet wurden.Aber sie können auch gleich sein.
Und anstelle von atime wird dann auch ctime angezeigt.
Ja. Schrieb ich ein paar Zeilen weiter oben ja auch:
ctime == mtime ? kann gar nicht sein.
Klar kann das sein.
😀
Freundliche Grüße,
Christian Kruse
Hello,
Hallo TS,
noatime
ist access time, nicht modification (mtime) oder creation time (ctime). ctime und mtime unterscheiden sich auch bei Dateisystemen, die mitnoatime
gemountet wurden.Aber sie können auch gleich sein.
Und anstelle von atime wird dann auch ctime angezeigt.
Ja. Schrieb ich ein paar Zeilen weiter oben ja auch:
ctime == mtime ? kann gar nicht sein.
Klar kann das sein.
😀
Klar. Habe ich auch gelesen.
Ich lese immer, was Du schreibst ;-) ,
Moin
Tom aus Husum
Wie ist denn das Device gemounted? vielleicht mit
no-atime
? Das wäre der übliche Standard.
Jein.
Tatsächlich ist seit Kernel 2.6.30 realatime "Standard".
Das genannte Changelog ist nicht (mehr) verfügbar, aber im (sehr) vertrauenswürdigen Krenn-Wiki steht das auch so.
An anderer Stelle habe ich gefunden, dass die access-Time mit realatime auch nur noch einmal am Tag (86400 s) gesetzt wird.
Hm. Standard?
Wenn man beim Mounten nur "defaults" als Option übergibt, dann sagt man 5 fstab
dazu:
defaults use default options: rw, suid, dev, exec, auto, nouser, and async.
Ich würde nur das als die "Standards" ansehen. Der Rest ergibt sich dann aus den Einstellungen für den Dateisystemtreiber im Kernel, wie zuvor beschrieben.
Hello,
damit meinte ich auch nichg OOTB, sondern die üblichen Einstellungen bei den meisten Providern.
Glück Auf
Tom vom Berg
die üblichen Einstellungen bei den meisten Providern.
Aha.
Erst mal: Auf Grund veralteter Informationen auf asbach-alten Webseiten hab ich auch lange gedacht, man sollte aus Performance-Gründen noatime
setzen. Das ist aber falsch.
Ich zeig Dir mal, wie realatime
wirkt:
user@host:~$ LANG=c stat .profile
File: .profile
Size: 1124 Blocks: 24 IO Block: 4096 regular file
Device: 34h/52d Inode: 28705471 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1000/ fastix) Gid: ( 1000/ fastix)
Access: 2019-12-21 14:08:38.099852967 +0100
Modify: 2019-05-17 13:36:14.804068799 +0200
Change: 2019-10-20 18:49:08.324084199 +0200
Birth: -
Heute ist der 22.12.2019. Den Rechner hab ich kurz vor 11:== angeschaltet und mich angemeldet. Wenn also atime
wirken wirken würde, müsste heute gegen 11:00 ein Zugriff auf die Datei .profile
registriert worden sein, denn in /etc/fstab steht als Mount-Option nur:
errors=remount-ro
Da aber seit Kernel 2.6.30 standardmäßig (man müsste ihn patchen und neu kompilieren oder aber mindestens Optionen beim Systemstart setzen um das anders zu machen) realatime
verwendet wird steht als Access-Time "was von gestern" drin.
Wieso sollte also "bei den meisten Providern" die "übliche Einstellung" noatime
gewählt werden? Das spräche dafür, dass die "meisten Provider" sehr viel weniger über den Linux-Kernel wissen als ich und also in langen Winternächten nur mit einer Extra-Schicht Sonnencreme ins Bett gehen.
Tun sie aber (hoffentlich) nicht.
Zu wissen, ob die Access-Time jünger als die Modify- oder Change-Time ist, ist übrigens für die eine oder andere Anwendung auch wichtig. Das klassische Beispiel hierfür ist der Mailer mutt
, der anhand der Zeiten entscheidet, ob ein Mail schon mal gelesen wurde oder nicht. Sowas kann auch für andere Programme wichtig sein.
Hello,
ja, Du hast Recht.
Anders herum wird ein Schuh draus.
Wenn man keine der Mountoptionen zum Zugriffslogging angibt, wird das Kerneldefault benutzt, was entweder realatime oder strictatime ist.
Wenn man das Logging wünscht, muss man mit atime
mounten, was aber nicht die Regel ist.
Wie sind da die Möglichkeiten bei Windows?
Glück Auf
Tom vom Berg
Wie sind da die Möglichkeiten bei Windows?
Da ist es genua umgekehrt wie bei Unix. Bei Windows steht das c in ctime für create und atime ist synchron mit mtime.
MFG
Hallo,
Da ist es genua umgekehrt wie bei Unix. Bei Windows steht das c in ctime für create und atime ist synchron mit mtime.
dafür passieren aber beim Kopieren mitunter lustige Dinge.
Beim Kopieren innerhalb des Filesystems bekommt nämlich die Kopie eine neue (aktuelle) ctime und atime, die mtime wird aber von der Originaldatei kopiert. So bekommt man Dateien, die (den Timestamps nach) schon modifiziert wurden, bevor sie überhaupt existiert haben.
Anders beim Kopieren über Verbindungen, bei denen Windows keinen Zugriff auf die Original-Timestamps hat (z.B. beim HTTP-Download). Dann bekommen beim Erzeugen der Kopie alle Timestamps (ctime, mtime, atime) den Timestamp von JETZT.
So long,
Martin
ja, Du hast Recht.
Anders herum wird ein Schuh draus.
Der Wortwitz ist göttlich.
PS: Dieser Beitrag ist unproduktiv und schadet dem Geist des Forums.
Wie sind da die Möglichkeiten bei Windows?
Hello,
ctime == mtime ? kann gar nicht sein. Is Bug?
PHPv5.3
Hast Du auch clearstatcache()
benutzt?
Außerdem sollte man besser die handlebasierte Funktion fstat()
benutzen. Ma kann da einfacher den TOCTTOU-Gap vermeiden (flock()
).
stat()
ist eigentlich nur noch für atime()
interessant.
Das ist aber eine Macke von PHP, bzw. C, weil die normale fopen()-Funktion das Assignen des Handles und dessen Benutzung nicht getrennt zur Verfügung stellt. Mit Pascal, wird dies getrennt bereitgestellt, genauso wie in den Assembler-APIs.
Glück Auf
Tom vom Berg
The "inode change timestamp" (the "-C" filetest) may really be the "creation timestamp" (which it is not in Unix).
Aha da hammers doch. Frage geklärt. MFG
Hallo pl,
The "inode change timestamp" (the "-C" filetest) may really be the "creation timestamp" (which it is not in Unix).
Aha da hammers doch. Frage geklärt. MFG
Ach, wie hast du denn das herausgefunden?
Bis demnächst
Matthias
The "inode change timestamp" (the "-C" filetest) may really be the "creation timestamp" (which it is not in Unix).
Aha da hammers doch. Frage geklärt. MFG
Ach, wie hast du denn das herausgefunden?
Das ist nicht die Frage. Vielmehr ist die Frage, wie man seine Anwendungen plattformunabhängig macht. Und zwar so daß sie in der Entwicklungsumgebung wie im Produktiveinsatz gleichermaßen funktionieren.
MFG
Hallo pl,
The "inode change timestamp" (the "-C" filetest) may really be the "creation timestamp" (which it is not in Unix).
Aha da hammers doch. Frage geklärt. MFG
Ach, wie hast du denn das herausgefunden?
Das ist nicht die Frage. Vielmehr ist die Frage, wie man seine Anwendungen plattformunabhängig macht. Und zwar so daß sie in der Entwicklungsumgebung wie im Produktiveinsatz gleichermaßen funktionieren.
Du wolltest doch immer wissen, was Arroganz bedeutet. Mit diesem Beitrag hast du ein sehr gutes Beispiel gebracht. Du bekommst hier Fragen beantwortet und tust dann so, als ob du die Antwort selbst erarbeitet hättest, natürlich nur mithilfe deines überragenden Geistes und deiner Berufs- und Programmiererfahrung, die die aller anderen hier weit in den Schatten stellt. Das ist nicht nur arrogant, das ist auch äußerst schäbig und widerlich.
Deine Selbstüberschätzung beginnt übrigens schon damit, einen Bug in einer Software zu vermuten, die millionenfach läuft, statt dich selbst zu fragen, ob du nicht vielleicht einem Irrtum aufgesessen bist.
Bis demnächst
Matthias
Hallo
Bei einem Problem nimmt man zunächst immer etwas an. Das ist eine übliche Herangehensweise. So hatte ich eben einen Bug angenommen und dabei völlig außer acht gelassen, daß meine Anwendungen auf verschiedenen Plattformen laufen. Trotzdem war meine Annahme absolut legitim und hat mit Selbstüberschätzung überhaupt nichts zu tun.
Im Übrigen nutzen Perl wie PHP dieselben C-Libraries.
PS: Ich kämpfe seit Jahren darum nach 2 Schlaganfällen mit nicht gerade trivialen Folgen zurück ins Leben zu kommen. Erzähle mir also nichts über Selbsteinschätzung!
Hallo pl,
PS: Ich kämpfe seit Jahren darum nach 2 Schlaganfällen mit nicht gerade trivialen Folgen zurück ins Leben zu kommen.
Dafür hast du auch meinen tiefen Respekt, Achtung und Anerkennung. Das hat aber nichts mit deinem Verhalten hier zu tun.
Bis demnächst
Matthias