Frage

Ich schrieb ein kleines Programm, das Dateien in einem Intervall von 1 Minute schafft. Aber der Zeitpunkt, an dem die Datei erstellt und zuletzt geschrieben, und der Zeitpunkt der letzten Änderung der Datei, wie unterscheidet sich um 1 Sekunde durch ls Befehl gezeigt. Der Code und die Ausgabe wird im Folgenden dargestellt. Bitte lassen Sie mich wissen, wo der Fehler sein könnte?

root@new:/home/srinivas# cat b.c
#include <time.h>
#include <stdio.h>
#include <sys/stat.h>
#include <dirent.h>
#include <fcntl.h>
int main ()
{
    int fd;
    int i=0;
    time_t initial_time = time(NULL);
    time_t interval = 60;
    time_t curr_time = time(NULL);

    fd=open ("test1.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666);
    write(fd,"abcd1",5);
    while(1)
    {
        curr_time = time(NULL);
        if(curr_time >= initial_time)
        {
            if(i==0)
            {
                close(fd);
                printf("\ntime before test2.txt fileopen= %d\n", time(NULL));
                fd=open ("test2.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666);
                write(fd,"abcd2",5);
                printf("time after test2.txt filewrite= %d\n", time(NULL));
                system("ls -l --time-style=+%s test2.txt");
                initial_time += interval;
                i=1;
            }
            else
            {
                close(fd);
                printf("\ntime before test1.txt fileopen= %d\n", time(NULL));
                fd=open ("test1.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666);
                write(fd,"abcd1",5);
                printf("time after test1.txt filewrite= %d\n", time(NULL));
                system("ls -l --time-style=+%s test1.txt");
                initial_time += interval;
                i=0;
            }
        }
        usleep(1000);
    }
    return 0;
}
root@new:/home/srinivas# gcc b.c
root@new:/home/srinivas# ./a.out

time before test2.txt fileopen= 1268203133
time after test2.txt filewrite= 1268203133
-rw-r--r-- 1 root root 5 1268203133 test2.txt

time before test1.txt fileopen= 1268203193
time after test1.txt filewrite= 1268203193
-rw-r--r-- 1 root root 5 1268203192 test1.txt

time before test2.txt fileopen= 1268203253
time after test2.txt filewrite= 1268203253
-rw-r--r-- 1 root root 5 1268203252 test2.txt

time before test1.txt fileopen= 1268203313
time after test1.txt filewrite= 1268203313
-rw-r--r-- 1 root root 5 1268203312 test1.txt

time before test2.txt fileopen= 1268203373
time after test2.txt filewrite= 1268203373
-rw-r--r-- 1 root root 5 1268203372 test2.txt

root@new:/home/srinivas# ls -ltr --time-style=+%s
total 40
-rwxrwxrwx  1 root     root      1095 1268202457 b.c
-rwxr-xr-x  1 root     root     10300 1268202459 a.out
-rw-r--r--  1 root     root         5 1268203312 test1.txt
-rw-r--r--  1 root     root         5 1268203372 test2.txt
root@new:/home/srinivas#

Danke und Gruß,

Srinivas

War es hilfreich?

Andere Tipps

Als erstes gibt es ein Problem in Ihrem Code.

  • Entfernen Sie die open() und write() vor der Schleife, werden sie nichts zu tun.
  • Bewegen Sie den zwei close() Anruf kurz nach den write() Anrufe.

Dadurch wird sichergestellt, dass die Daten geschrieben und die Datei geschlossen, bevor Sie ihre Änderungszeit mit ls suchen. Ansonsten gibt es eine Verzögerung von 1 Sekunde zwischen dem write () und dem Schließen (). Da Sie nur 5 Bytes schreiben, wird es, gepuffert. Also, wenn Sie die Zeit nach dem Schreiben () -Aufruf sind die Überprüfung, haben Sie keine Garantie, dass die Daten noch nicht geschrieben worden sind, so dass die Datei nicht geändert worden sein, die Ihre Ergebnisse schrauben kann.

Zweitens kann man nicht eine Verzögerung von 1 Sekunde, weil time() und ls Bericht einer 1 Sekunde Differenz übernehmen. Da eine zweite Ihre kleinste Einheit ist, sollten Sie Rundungsdifferenz erwarten. Und da Sie sind mit zwei verschiedenen Methoden die Anzahl der Sekunden seit der Epoche zu bekommen, können sie unterschiedliche Rundungsregeln verwenden, die sich leicht in 1 Sekunde Differenz führt. Wenn wir, dass das Dateisystem, das Speichern der Änderungszeit hinzufügen, die Sie tatsächlich haben drei verschiedene Akteure, die Ergebnisse beeinflussen können.

Auch wenn Sie richtig in der Folge betrachten, werden Sie sehen, dass seine time(), die als ls eine Sekunde später anzuzeigen. Also, Sie keine Verzögerung überhaupt haben, gehen Sie zurück in die Zeit! Die Rundungsdifferenz ist der wahrscheinlichste Grund dafür.

So gibt es keine Fehler in Linux Zeit sind () Funktion oder Linux-Betriebssystem aufruft.

  • Schreiben in eine Datei dauert einige Zeit.
  • zur Zeit () aufrufen Funktion dauert einige Zeit,
  • die Ausführung der Logik der Funktion time () dauert einige Zeit.

All diese Ergebnisse in der 1 sec Verzögerung ..Its überhaupt einen Fehler nicht!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top