Pergunta

Eu escrevi um pequeno programa, que cria arquivos em um intervalo de 1 minuto. Mas o momento em que o arquivo é criado e gravado pela última eo último tempo de modificação do arquivo como mostrado pelo comando ls difere por 1 segundo. O código e o resultado é apresentado abaixo. por favor deixe-me saber onde poderia ser o bug?

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#

Obrigado e cumprimentos,

Srinivas

Outras dicas

Em primeiro lugar, há um problema em seu código.

  • Remova o open() e write() antes do loop, eles não estão fazendo nada.
  • Mover a chamada duas close() logo após as chamadas write().

Isto irá assegurar que os dados são gravados eo arquivo fechado antes de olhar o seu tempo de modificação usando ls. Caso contrário, há um 1 segundo de atraso entre o write () e close (). Desde que você está escrevendo apenas 5 bytes, ele vai ficar tamponada. Assim, quando você está verificando o tempo após a chamada write (), você não tem nenhuma garantia de que os dados ainda não foram escritos, de modo que o arquivo não pode ter sido modificado, o que pode estragar seus resultados.

Em segundo lugar, você não pode assumir um atraso de 1 segundo, porque time() e relatório ls a 1 segunda diferença. Desde a segunda é a sua unidade menor, você deve esperar diferença de arredondamento. E uma vez que você estiver usando dois métodos diferentes para obter o número de segundos desde Epoch, eles podem usar as regras de arredondamento diferentes, que irá facilmente resultar em uma segunda diferença 1. Se somarmos a isso o sistema de arquivos que armazenam o tempo de modificação, você realmente tem três atores diferentes que podem influenciar os resultados.

Além disso, se você olhar corretamente em seu resultado, você vai ver que a sua time() que indicam um segundo mais tarde do que ls. Então, você não tem um atraso em tudo, você vai voltar no tempo! A diferença de arredondamento é a razão mais provável para isso.

Assim, não há erro em tempo Linux () ou Linux OS chamadas.

  • escrevendo em um arquivo leva algum tempo.
  • chamada para a função time () leva algum tempo
  • a execução da lógica da função time () leva algum tempo.

Tudo isso resulta nos ..Its 1 seg de atraso não é de todo um bug!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top