¿Es un error en tiempo de Linux (función o el sistema operativo Linux llamadas)?

StackOverflow https://stackoverflow.com/questions/2415018

  •  19-09-2019
  •  | 
  •  

Pregunta

he escrito un pequeño programa, que crea archivos en un intervalo de 1 minuto. Pero el momento en que se creó el archivo y último escrito y la última hora de modificación del archivo tal como se muestra por el comando ls difiere en 1 segundo. El código y la salida se presentan a continuación. por favor hágamelo saber donde podría ser el error?

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#

Gracias y saludos,

Srinivas

Otros consejos

En primer lugar, hay un problema en el código.

  • Eliminar el open() y write() antes del bucle, que no están haciendo nada.
  • Mover la llamada de dos close() justo después de las llamadas write().

Esto asegurará que los datos se escriben en el archivo y cierra antes de mirar su fecha de modificación usando ls. De lo contrario, hay un retardo de 1 segundo entre la escritura () y el cierre (). Puesto que usted está escribiendo sólo 5 bytes, que conseguirá tamponada. Por lo tanto, cuando se está comprobando el tiempo después de la llamada de escritura (), usted no tiene ninguna garantía de que los datos se han escrito todavía, por lo que el archivo no puede haber sido modificado, que puede atornillar sus resultados.

En segundo lugar, no se puede asumir un retardo de 1 segundo, porque time() y ls informe de una segunda diferencia 1. Dado que un segundo es su unidad más pequeña, usted debe esperar que la diferencia de redondeo. Y dado que está utilizando dos métodos diferentes para obtener el número de segundos desde el Epoch, se pueden utilizar diferentes reglas de redondeo, lo que resultará fácilmente en una segunda diferencia 1. Si añadimos a que el sistema de archivos que almacenan la fecha de modificación, que en realidad tienen tres actores diferentes que pueden influir en los resultados.

Además, si nos fijamos bien en su resultado, verá que su time() que indican un segundo después de ls. Por lo tanto, usted no tiene un retraso en absoluto, que va atrás en el tiempo! La diferencia de redondeo es la razón más probable para esto.

Por lo tanto, no hay error en tiempo de Linux () la función o el sistema operativo Linux llamadas.

  • escribir en un archivo lleva algún tiempo.
  • llamar a la función time () toma algún tiempo
  • la ejecución de la lógica de la función de tiempo () toma algún tiempo.

Todo esto resulta en el retraso de 1 segundo no ..Its en absoluto un error!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top