Это ошибка в функции Linux time() или вызовах ОС Linux?

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

  •  19-09-2019
  •  | 
  •  

Вопрос

Я написал небольшую программу, которая создает файлы с интервалом в 1 минуту.Но время создания и последней записи файла и время последней модификации файла, показанное командой ls, отличаются на 1 секунду.Код и выходные данные представлены ниже.пожалуйста, дайте мне знать, где может быть ошибка?

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#

Спасибо и с уважением,

Шринивас

Это было полезно?

Другие советы

Во-первых, в вашем коде есть проблема.

  • Удалите open() и write() перед циклом они ничего не делают.
  • Переместите эти два close() позвоните сразу после write() звонки.

Это гарантирует, что данные записаны и файл закрыт до того, как вы посмотрите время его изменения с помощью ls.В противном случае между write() и close() возникает задержка в 1 секунду.Поскольку вы записываете всего 5 байт, он будет буферизован.Таким образом, когда вы проверяете время после вызова write(), у вас нет гарантии, что данные еще не были записаны, поэтому файл, возможно, не был изменен, что может испортить ваши результаты.

Во-вторых, вы не можете предположить задержку в 1 секунду, потому что time() и ls сообщите о разнице в 1 секунду.Поскольку секунда - это ваша наименьшая единица измерения, вы должны ожидать разницы в округлении.И поскольку вы используете два разных метода для получения количества секунд, прошедших с Эпохи, они могут использовать разные правила округления, что легко приведет к разнице в 1 секунду.Если мы добавим к этому файловую систему, в которой хранится время модификации, у вас фактически есть три разных участника, которые могут повлиять на ваши результаты.

Кроме того, если вы правильно посмотрите на свой результат, вы увидите, что его time() которые указывают на одну секунду позже, чем ls.Итак, у вас вообще нет задержки, вы возвращаетесь в прошлое!Разница в округлении является наиболее вероятной причиной этого.

Таким образом, в функции Linux time() или вызовах ОС Linux нет ошибок.

  • запись в файл занимает некоторое время.
  • вызов функции time() занимает некоторое время
  • выполнение логики функции time() занимает некоторое время.

все это приводит к задержке в 1 секунду .. Это вовсе не ошибка!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top